如何创建一个在所有表单上触发的通用reducer插件?

时间:2017-03-28 15:44:14

标签: redux-form

目前我的代码有效,但仅适用于在combine reducer函数中专门指定的表单。但是,我希望我的代码通常适用于我的单页应用程序中加载的所有表单。

以下是相关代码:

import { reducer as formReducer } from 'redux-form';
export default combineReducers({
  someReducer,
  anotherReducer,
  form: formReducer.plugin({
    specificFormId: (state, action) => { // <-- I don't want this only for specificFormId, I want this to happen for all my forms,
                                        // or at least have a dynamic way of adding more forms
      const {type, payload} = action;
      switch(type) {
        case 'RESET_LINK_TYPE_FIELDS': {
          return {
            ...state,
            registeredFields: {
              ...state.registeredFields,
              // Do some custom restting here based on payload
            }
          };
        }
        default:
          return state;
      }
    }
  })
});

因此,只要我的<Field ..of a certain type/>触发了RESET_LINK_TYPE_FIELDS操作,我就会想要正确的表单来回复它。

在动作有效负载中,我可以具体使用表单标识符或其他任何我需要的功能。

事实上,如果.plugin允许我自己进行表单状态切片,我可以很容易地做到这一点,但是因为它迫使我传递一个对象,使用硬编码的表单标识符它不起作用。

有没有办法让插件给我WHOLE表单状态,然后我会根据需要进行切片,并根据负载返回状态?

1 个答案:

答案 0 :(得分:2)

目前无法使用现有API执行此操作。

可以通过将redux-form减速器包装在你自己的东西中来判断一个解决方案。

export default combineReducers({
  someReducer,
  anotherReducer,
  form: resetHack(formReducer)
})

function resetHack(formReducer) {
  return (state, action) => {
    if(action.RESET_LINK_TYPE_FIELDS) {
      // manipulate slice somehow
    } else {
      return formReducer(state, action)
    }
  }
}