减速器中所有动作的通用修改

时间:2019-04-12 04:16:31

标签: reactjs react-redux

所以这是问题所在,我需要对每一个动作(除了一个动作之外)进行修改,以便始终执行。因此,为了实现这一点,我做了以下工作。有没有更好的方法可以做到这一点?

export const reducer = (state, action) => {
  switch (action.type) {
    case 'AddCheckboxJson': {
      return ReducerWrapper({ ...state,objCheckBox:action.payload  });
    }
    case 'insertAt':return ReducerWrapper({
      ...state,objCheckBox:{...state.objCheckBox,
        Values:insertAt(action.payload.index,action.payload.entry,"iDisplayOrder",state.objCheckBox)
      }
    })
    case 'INSERT_ABOVE': 
      return ReducerWrapper({
        ...state, objRadio: {
          ...state.objRadio,
          Values: action.payload
        }
      })

    case 'INSERT_BELOVE': 
      return ReducerWrapper({
        ...state, objRadio: {
          ...state.objRadio,
          Values: action.payload
        }
      }),
    case 'REPLACE':return { ...action.payload }
    default: {
      return state;
    }
  }
};

此处函数 ReducerWrapper 进行了常见的修改

export const ReducerWrapper = State => {
   return {...State,
    //modifications done here
   }
}

1 个答案:

答案 0 :(得分:1)

这确实比看起来简单得多,只是返回您不想要应用附加状态的两种情况,即

export const reducer = (state, action) => {
  switch (action.type) {
    case 'AddCheckboxJson': {
      state = { 
        ...state, 
        objCheckBox: action.payload 
      };
    }
    case 'insertAt': {
      state = {
        ...state,
        objCheckBox:{
          ...state.objCheckBox,
          Values: insertAt(
            action.payload.index, 
            action.payload.entry, 
            "iDisplayOrder", 
            state.objCheckBox
          )
        }
      }
    }
    case 'INSERT_ABOVE': { 
      state = {
        ...state, 
        objRadio: {
          ...state.objRadio,
          Values: action.payload
        }
      }
    }
    // presumably this should be INSERT_BELOW?
    case 'INSERT_BELOVE': {
      state = {
        ...state, 
        objRadio: {
          ...state.objRadio,
          Values: action.payload
        }
      }
    },
    // return the state early in both these scenarios
    case 'REPLACE': return { ...action.payload }
    default: return state;
  }

  // run additional state change
  return ReducerWrapper(state);
};