【问题标题】:Can i use dispatch like setState in this problem?我可以在这个问题中使用像 setState 这样的调度吗?
【发布时间】:2020-02-05 10:54:39
【问题描述】:

我正在将此应用程序转换为 Redux,但自定义句柄函数正在使用 {name , value } = event.target

  handleChange = event => {      
      const { name, value } = event.target;

      this.setState({
          [name] : value
      });
  }

在这里,他们为所有字段动态地采用单个处理程序 但在我的情况下,我使用了 dispatch 'react-redux hooks' 而不是 setState

     this.setState({
          [name] : value
      });

     dispatch(reducerName({
          type: 'SET_NAME / SET_EMAIL / SET_any_other_fiels',
          payload: value
      })

我的解决方案是为每个字段制作 handleChange[type] 或者我可以做点别的吗? 我有字段

let initialState = {
   name,
   email,
   walletid:'',
    payout:0,
    bank:{          
      bank: 0,
      expenditures: 0,
      fees: 0,
      income: 0,
      receipts: 0,
      rejected: 0          
    }
}
i want to share the single case in reducer to add all fields 

【问题讨论】:

    标签: reactjs redux


    【解决方案1】:

    您可以在动作负载中直接传递 key、value 并在 reducer 中使用它们。

     var payload = {
               name: name,
               value: value
              }
    
     dispatch(reducerName({
                  type: 'SETFIELDS',
                  payload: payload
              })
    
    const reducer = (state = initialState, action) => {
        if (action.type == 'SETFIELDS') {
                // Return new modified state
                return {
                    ...state,
                    [action.payload.name]: action.payload.value
                };
            }
            // Default
            return state;
    }
    

    【讨论】:

    • 我看起来很棒,谢谢,但我的情况是,我也将减速器用于其他字段来设置其他数据。我可以使用 switch 和 if 还是我必须使用 if-else-ladder
    • 你可以选择其中任何一个。
    【解决方案2】:

    您确定要 onChange 修改全局存储值吗?

    不管怎样,如果这是你想要的——怎么样:

    const reducer = (state = initialState, action) => {
        if (action.type.startsWith('SET')) {
                // Get all parts expect SET part (for example ['ANY', 'OTHER', 'FIELD'])
                const actionKeyArr = action.type.split('_').slice(1);
                // Make it one long string, as saved on initial state (for example 'anyotherfield')
                const keyToChange = actionKeyArr.join('').toLowerCase();
    
                // Return new modified state
                return {
                    ...state,
                    [keyToChange]: action.payload
                };
            }
    
            // Default
            return state;
    }
    

    【讨论】:

    • 所以在这种情况下,我将 switch 用于其他目的,例如 switch( action.type ) { case 'SET_DATA': return state.data = action.payload 我可以同时使用两者吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2013-02-08
    • 2014-06-10
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多