【发布时间】:2019-07-19 23:35:50
【问题描述】:
我是 Redux 的新手,并试图弄清楚如何充分利用它。
为应用程序的模块编写选择器时,应将状态树的哪一部分传递给选择器,以使选择器既可重用又可模块化?
例如,给定下面的代码,以类似于stateShapeExample 的状态形状编写selectModuleItemsById 的好方法是什么?
let stateShapeExample = {
module: {
items: {
firstItemId: {...},
secondItemId: {...},
...
}
}
}
const selectModuleRoot = (state) => state.module;
// First Option: starts from the module root
const selectModuleItemById = (state, id) => state.items[id];
// Second Option: starts from the global root
const selectModuleItemById = (state, id) => state.module.items[id];
// Something Else: ???
const selectItemById = (state, id) => state[id];
【问题讨论】:
-
如果您的选择器引用状态的全局根,一旦您决定将子树分解为几个或将一些数据移动到不同状态的分支,则需要做更多的工作
-
@skyboyer 从应用程序的其他部分使用它们也会更早。由于您只需要一个函数来访问您正在查找的数据,因此您不需要知道要调用的其他选择器的顺序来获取传递给您需要的选择器的状态。对状态形状的更改可能会更改选择器的顺序。然后,首先使用选择器没有任何优势。如果您要查找的项目深深嵌套在状态树中,则尤其如此。
-
不,拥有
export const selectItemById = (globalState, id) => selectModuleRoot(globalState)[id],您将不需要知道序列 -
@skyboyer 但是
selectItemById不能用于通过id选择其他类型的项目,所以它的可重用性降低了。如果状态树中有多个模块实例也会有问题。 -
也许您正在寻找类似
getEntityByIdentity(state, {id: 'abc123', type: 'module'})的东西。此外,您应该避免在状态下拥有相同数据的副本;改为存储 id 引用。
标签: javascript redux react-redux