Как я могу передать состояние и действие в Redux в функциональном компоненте?

#reactjs #redux #react-hooks #action #redux-saga

Вопрос:

Я пытаюсь использовать форму крючков реакции и передавать значения в состояние из хранилища Redux через действие setLog (), и, как я понимаю, мое действие не работает, но не проходит через какие-либо ошибки. Итак, я не знаю, что именно происходит не так. Кроме того, я использую redux-saga, но пока я им не пользуюсь, я просто объявил об этом, это может быть проблемой или нет?

SignUp.js файл

 import React from "react";
import { useForm } from "react-hook-form";
import { connect } from "react-redux";

import { setLog } from "../actions";

 function SignUp({ info }) {

 const { register, handleSubmit, setValue } = useForm();

 const onSubmit = data => setLog(data);

return (
  <React.Fragment>
    <form onSubmit={handleSubmit(onSubmit)}>
        <input {...register("login")} />
        <input {...register("password")} />
        <input type="submit" />
    </form>
    {/* <h1>{info}</h1> */}
  </React.Fragment>

);
}

const mapStateToProps = (state) => {
return {
    info: state.signUp
};
}


export default connect(mapStateToProps, { setLog })(SignUp);
 

Действия:

  export const setLog = (data) => {
return {
    type: 'SET_LOG',
    payload: data
};
}
 

Редуктор регистрации

 export default(state=[],action) => {
switch(action.type){
    case 'SET_LOG':
        return [...state, ...action.payload];
    default:
        return state;
}
}
 

Мой магазин:

 import { createStore, applyMiddleware, compose } from 'redux';
import createSagaMiddleware from 'redux-saga';

import rootSaga from '../sagas';

import rootReducer from '../reducers';

const configureStore = () => {
const sagaMiddleware = createSagaMiddleware();
const store = createStore(
    rootReducer,
    window.__REDUX_DEVTOOLS_EXTENSION__
        ? compose(
              applyMiddleware(sagaMiddleware),
              window.__REDUX_DEVTOOLS_EXTENSION__(),
          )
        : applyMiddleware(sagaMiddleware),
);
sagaMiddleware.run(rootSaga);
return store;
};

 export default configureStore;
 

Ответ №1:

Что происходит, так это то, что вы не вызываете setLog из реквизитов, вы просто вызываете функцию, не связывая ее с redux, вам нужно прикрепить функцию с помощью функции mapDispatchToProps и вызвать отправку внутри этой функции следующим образом:

 const mapDispatchToProps = (dispatch) => {
  return {
    // Calling it submitLog to avoid name collisions with the imported setLog
    submitLog: (data) => dispatch(setLog(data)),
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(SignUp);
 

Приведенный выше код соединяет действие с redux, теперь вам просто нужно вызвать его как опору, как это:

 // Now you will have the submitLog as a prop and it will be tie to redux.
function SignUp({ info, submitLog }) {

 const { register, handleSubmit, setValue } = useForm();

 const onSubmit = data => submitLog(data);

 // Rest of the code
}