我的商店包含goal
个数组。有一个Goal组件,我使用connect()连接到redux商店,因此它有一个goal
作为其道具。
目标组件有子项,所有子项都需要整个目标对象来创建派生数据。我想使用重新选择来帮助提取这些数据是如何导出的,但是当我已经访问目标时,再次从整个redux存储中选择相同的目标是没有意义的。
因此,我目前正在将目标组件中的目标对象传递给其子组件,并在其上调用选择器。
这意味着选择器的参数只是一个目标,是状态的一部分,而不是全部状态。关于如何使用这个用法的所有例子" connect"因此选择器功能会占据整个状态。
我的方法有意义吗?或者我完全错过了这一点,而且我已经不再正确地封装状态树的形状了?
任何意见/建议将不胜感激
答案 0 :(得分:2)
选择器的目的是保存派生数据,以便您的redux商店不必。传递状态树的子部分是合法的:
const getThing = state => state.the.thing.I.care.about;
const getBoundaryConditions = state => state.the.boundary.conditions.man.whoa;
export const getTheThingICareAbout = createSelector(
[ getThing, getBoundaryConditions ],
(thing, conditions) => {
//do stuff to thing depending on conditions
return thing.beConditionallyAwesome(conditions);
}
);
此外,虽然可以通过道具将目标对象传递给Goal组件的子组件,但最好通过props将id值(或其他)传递给子组件并使其具有子项使用connect()
从状态树中获取相应的目标(请参阅mergeProps
here强大的第三个connect()
参数,该参数允许您使用传入的道具ownProps
与整个州树和派遣一起 - 它可以非常方便)。
这是更好的,因为目标组件不必通过道具传递一个大的胖对象。相反,子组件可以在mapStateToProps()
中选择他们关心的目标对象的特定部分,并使组件道具保持浅浅。
......至少那是我的看法。祝你好运!
答案 1 :(得分:1)
你可以选择通过道具传递一个目标(从父母到孩子) - 这意味着父母是"聪明的" (知道国家)和孩子,如果"哑巴" (只是呈现道具中给出的内容)。
或者,您可以在子组件中访问状态(尽可能多或少)。