重新选择 - 将部分状态传递给选择器是否有意义

时间:2016-10-20 21:13:30

标签: reactjs redux react-redux reselect

我的商店包含goal个数组。有一个Goal组件,我使用connect()连接到redux商店,因此它有一个goal作为其道具。

目标组件有子项,所有子项都需要整个目标对象来创建派生数据。我想使用重新选择来帮助提取这些数据是如何导出的,但是当我已经访问目标时,再次从整个redux存储中选择相同的目标是没有意义的。

因此,我目前正在将目标组件中的目标对象传递给其子组件,并在其上调用选择器。

这意味着选择器的参数只是一个目标,是状态的一部分,而不是全部状态。关于如何使用这个用法的所有例子" connect"因此选择器功能会占据整个状态。

我的方法有意义吗?或者我完全错过了这一点,而且我已经不再正确地封装状态树的形状了?

任何意见/建议将不胜感激

2 个答案:

答案 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)

你可以选择通过道具传递一个目标(从父母到孩子) - 这意味着父母是"聪明的" (知道国家)和孩子,如果"哑巴" (只是呈现道具中给出的内容)。

或者,您可以在子组件中访问状态(尽可能多或少)。