如何从react-hook-form + Redux调度

时间:2019-12-06 15:26:56

标签: javascript reactjs redux react-hook-form

我正在使用react-hook-form(https://react-hook-form.com/)。 我想从react-hook-form内部调度动作。

在以下情况下,当onSubmit被触发时,我应该使用props.dispatch进行调度。

但是我不知道如何通过setState分配和更新状态。

import React from 'react'
import useForm from 'react-hook-form'

export default function App(props) {
  const { register, handleSubmit, watch, errors } = useForm()
  const onSubmit = data => { 
           console.log(data);
           props.dispatch({type: 'CONFIRM'}); //--> Worked!!  
        }

  console.log(watch('example')) // watch input value by passing the name of it

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input name="example" defaultValue="test" ref={register} />
      <input name="exampleRequired" ref={register({ required: true })} />      
      <input type="submit" />
    </form>
  )
}

有人给我建议吗?

class Sample extends Component {
    constructor(props){
        super(props);
        this.state = {
            mode: 'input'
        }
    }

    render() {
        switch (this.state.mode) {
            case 'input':
                return (<App />);
            case 'confirm':
                return (<App01 />);
            default:
                return (<App02 />);
        }
    }
}

export default connect((state)=>state)(Sample);

2 个答案:

答案 0 :(得分:2)

在redux中使用调度与react-hook-form库无关。

如果您使用redux-hooks(即an alternative for connect),并且如果还是使用react-hook-form的钩子,则是一种更好的方法:

  

React的新“挂钩” API使功能组件能够使用本地组件状态,执行副作用等。

     

React Redux现在提供了一组挂钩API,以替代现有的connect()高阶组件。这些API允许您订阅Redux存储和调度操作,而不必将组件包装在connect()中。

import { useDispatch } from 'react-redux';
function App() {
  const dispatch = useDispatch();
  // use distpach
}

如果您使用connect

import { connect } from 'react-redux';
function App({ dispatch }) {
  // use dispatch
}

export default connect()(App);

答案 1 :(得分:1)

我想通了。 我正在使用combineReducers。分心。 我应该写如下。

combineReducers({
    sample01: sample01Reducer, sample02: sample02Reducer,    //Reducers
class Sample extends Component {
    constructor(props){
        super(props);
        this.state = {
            mode: 'input'
        }
    }

    render() {
        switch (this.props.sample01.mode) {
            case 'input':
                return (<App />);
            case 'confirm':
                return (<App01 />);
            default:
                return (<App02 />);
        }
    }
}

export default connect((state)=>state)(Sample);