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

Reselect - does it ever make sense to pass only part of the state to a selector

我的商店包含一个 goal 数组。有一个目标组件,我使用 connect() 连接到 redux 存储,所以它有一个 goal 作为它的道具。

目标组件有子组件,它们都需要整个目标对象才能从中创建派生数据。我想使用 reselect 来帮助提取这些数据的派生方式,但是当我已经可以访问时,从整个 redux 存储中再次 select 相同的目标对我来说没有意义目标。

所以我目前正在将目标对象从目标组件传递给它的子组件,并在我这样做时调用 selector。

这意味着selector的论点只是一个目标,是国家的一部分,而不是国家的全部。如何使用此方法的所有示例都使用 "connect",因此 select 或函数采用整个状态。

我的方法有意义吗?还是我完全错过了重点,我没有再正确封装状态树的形状?

如有任何意见/建议,我们将不胜感激

您可以选择通过道具(从 parent 到 child)传球 - 这意味着 parent 是 "smart"(了解状态)和 child if "dumb" (只渲染道具中给出的内容)。

或者,您可以访问 child 组件中的状态(任意多或少)。

selector 的目的是保存派生数据,这样您的 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);
  }
);

此外,虽然可以通过 props 将目标对象传递给 Goal 组件的子级,但最好通过 props 将 id 值(或其他东西)传递给子级并让子级获得使用 connect() 的状态树的相应目标(请参阅 connect() here 的强大的第三个 mergeProps 参数,它允许您使用传入的道具 ownProps整个状态树和调度 - 它可以非常方便)。

这样更好,因为目标组件不必通过道具向下传递一个大胖对象。相反,子组件可以 select 他们在 mapStateToProps() 中关心的目标对象的特定部分,并使组件属性尽可能浅。

...至少我是这么认为的。祝你好运!