关于如何将redux-form减速器安装在正确的位置,我被困在这里。
我有一个名为person的命名空间的初始状态(在应用程序中的许多其他命名空间中),如下所示:
{
personList: [],
creatingNewPerson: false,
newPerson: {}
}
newPerson状态是一种形式。如何让redux-reducer单独作用于newPerson状态呢?
当然,你可以做类似
的事情combineReducers({
person: personReducer, // that's a reducer using the above json
newPerson: formReducer // import { reducer as formReducer } from 'redux-form'
})
但那不是我追求的结构。 newPerson的州将在人员州之外进行管理。但我希望它能在里面进行管理。
状态redux-form管理时应该可以进行JSON序列化。
如何实现这一目标?希望我能说清楚自己吗?
答案 0 :(得分:1)
不幸的是redux-form
在这种特殊情况下似乎很自以为是,the general sentiment from the documentation非常明确:您应该将formReducer
挂载到状态树的根目录下form
-key。
原因很简单:formReducer
将处理所有表单的状态,而不仅仅是新人表单。因此,州将看起来像这样:
{
person: { ... person-related state ... },
form: {
NewPersonForm: { ... new person form state ... },
SomeOtherForm: { ... some other form state ... },
...
NthAdditionalForm: { ... nth additional form state ... }
}
}
这意味着如果你想为嵌套在reducer中的每个表单定位状态,结果对象将最终进入,你必须在多个位置添加formReducer
的实例,这将不必要地使你的州变得复杂。
我的建议:在这种情况下吃掉你的谚语绿色,只需将formReducer
插入默认位置,因为这样你就可以享受redux-form
的强大功能,而不会有任何额外的麻烦。< / p>
现在,在阅读了上述内容之后,如果您仍未设置实际将formReducer
安装在州树的潮湿和黑暗迷宫深处,您可以做点什么如下:
combineReducers({
persons: combineReducers({
person: personReducer,
newPerson: formReducer
}),
other: otherReducer,
...
some: someReducer
})
然后您还需要将getFormState
传递给每个reduxForm
包裹的组件,以便他们知道您隐藏其状态的位置:
const getFormState = state => {
// return the slice of state where we hid formReducer
return state.persons.newPerson
}
reduxForm({ getFormState })(SomeForm)
这是我不能,良心,推荐,但应该产生你想要的结果(除了可能会产生令人讨厌的副作用,如果你在你的应用程序中添加超过这一个表格)。
希望这有帮助!