【问题标题】:Update store based on user input data in React-Redux根据 React-Redux 中的用户输入数据更新存储
【发布时间】:2021-09-20 18:33:45
【问题描述】:

我有使用钩子的经验,但没有使用基于类的组件和 redux。

我有一个向导表单,Page1 有 firstNamelastName 输入字段。一个 next 按钮,该按钮将转到 Page2 并在必要时充当提交。

我期待什么?

当用户在其中一个字段中输入一些值时,它应该更新 redux 存储。 (我不确定是否应该直接在输入字段的onChange 事件上更新存储先将其存储在状态中,然后在onSubmit 上更新存储)

更新:

目前,此代码不起作用。每当我在 firstName 输入字段中键入第一个字符时,它在商店中的属性都会变得未定义。

// store.js FILE
const rootReducer = combineReducers({
  signUpCounterPage: reducer1,
  user: reducer2, 
});

const store = createStore(
  rootReducer,
  composeWithDevTools(applyMiddleware(logger))
);


// Types.js FILE
export const UPDATE_FIRSTNAME = "UPDATE_FIRSTNAME";
export const UPDATE_LASTNAME = "UPDATE_LASTNAME";
export const UPDATE_ADDRESS = "UPDATE_ADDRESS";
export const UPDATE_APT_UNIT = "UPDATE_APT_UNIT";
// --------------------------

// Actions.js FILE
export const updateFirstName = (action) => ({
  type: UPDATE_FIRSTNAME,
  ...action,
});

export const updateLastName = (action) => ({
  type: UPDATE_LASTNAME,
  action,
});

export const updateAddress = (action) => ({
  type: UPDATE_ADDRESS,
  action,
});

export const updateAptUnit = (action) => ({
  type: UPDATE_APT_UNIT,
  action,
});
// --------------------------


// reducer2.js FILE
const initialState = {
  firstName: "",
  lastName: "",
  address: "",
  aptUnit: "",
};

const signupUserReducer = (state = initialState, action) => {
  switch (action.type) {
    case UPDATE_FIRSTNAME:
      return { ...state, firstName: action.value };
    case UPDATE_LASTNAME:
      return { ...state, lastName: action.value };
    case UPDATE_ADDRESS:
      return { ...state, address: action.value };
    case UPDATE_APT_UNIT:
      return { ...state, aptUnit: action.value };
    default:
      return state;
  }
};
// --------------------------


// Page1.js FILE
    const mapStateToProps = (state) => ({
      firstName: state.firstName,
    });
    const mapDispatchToProps = (dispatch, param) => ({
      updateFirstName: () => dispatch(updateFirstName(param.value)),
    });

    class Page1 extends Component {
      state = {
        firstName: "",
        lastName: "",
      };
      render() {
        const {
          nextPage,
          firstName,
          updateFirstName
        } = this.props;
        return ( <
          div className = "onboarding-page d-flex justify-content-center align-items-center" >
          <
          div className = "d-flex flex-column align-items-center" >
          <
          Form className = "d-flex flex-column justify-content-center" >
          <
          Form.Row >
          <
          Form.Group as = {
            Col
          }
          controlId = "formGridFirstName" >
          <
          Form.Control type = "text"
          placeholder = "Enter First Name"
          value = {
            firstName
          }
          onChange = {
            (e) => updateFirstName({
              value: e.target.value
            })
          }
          />  <
          /Form.Group>

          <
          Form.Group as = {
            Col
          }
          controlId = "formGridLastName" >
          <
          Form.Control type = "text"
          placeholder = "Enter Last Name"
          value={lastName}
          onChange={(e) => updateLastName({ value: e.target.value })}
          /
          >
          <
          /Form.Group> < /
          Form.Row > <
          Form.Group className = "d-flex justify-content-center" >
          <
          Button variant = "primary"
          size = "medium"
          onClick = {
            nextPage
          } >
          Next < /
          Button > <
          /Form.Group> < /
          Form > <
          /div> < /
          div >
        );
      }
    }

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

【问题讨论】:

  • 您可以直接使用 onChange 更新商店,而无需创建任何内部状态
  • 谢谢。但现在这段代码不起作用。每当我在 firstName 输入字段中输入第一个字符时,它在商店中的属性就会变得未定义。
  • 你能分享你在代码沙箱中的代码吗??
  • const mapDispatchToProps = (dispatch) =&gt; ({ updateFirstName: (param) =&gt; dispatch(updateFirstName(param)), updateLastName: (param) =&gt; dispatch(updateLastName(param)) })

标签: reactjs redux react-bootstrap


【解决方案1】:
const mapDispatchToProps = (dispatch) => ({ updateFirstName: (param) => dispatch(updateFirstName(param)), updateLastName: (param) => dispatch(updateLastName(param)) })

请更新你的 mapDispatchToProps 函数,你犯了一个小错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2020-01-16
    • 2020-10-15
    • 2017-07-10
    相关资源
    最近更新 更多