1

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

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

因此,我目前正在将目标对象从 Goal 组件传递给它的子组件,并在这样做时调用它的选择器。

这意味着选择器的参数只是一个目标,是状态的一部分,而不是所有状态。如何使用它的所有示例都使用“连接”,因此选择器函数采用整个状态。

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

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

4

2 回答 2

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);
  }
);

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

这更好,因为 Goal 组件不必通过道具向下传递一个大的胖对象。相反,子组件可以选择他们关心的目标对象的特定部分,mapStateToProps()并使组件道具保持应有的浅层。

……至少这是我的看法。祝你好运!

于 2016-10-20T23:21:52.863 回答
1

您可以选择通过道具(从父母到孩子)传递一个目标——这意味着父母是“聪明的”(知道状态)而孩子是“愚蠢的”(只是渲染道具中给出的内容)。

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

于 2016-10-20T23:15:52.023 回答