Redux mapStateToProps属性依赖项

时间:2017-05-19 08:43:39

标签: javascript reactjs redux react-redux

我的mapStateToProps功能

const mapStateToProps = (state, props) => ({
   object: {},
   criteria: []
 });

它包含两个属性:

1。 object属性

它从商店获得与URL的对象ID相对应的对象。

生成的对象如下所示:

{
  object: {
    id: 42,
    criteria: [1, 2, 3]
  }
}

2。 criteria属性

这个应该从商店中获取条件对象,其中包含先前获取的对象的标准ID的ID。

我提出了以下功能:

const mapStateToProps = (state, props) => ({
  object: getObjectById(state, props.routeParams.objectId),
  criteria: getCriteriaByIds(state, getObjectById(state, ownProps.routeParams.objectId) ? getObjectById(state, ownProps.routeParams.objectId).criteria : []),
});

问题

这里有很多重复。如果我直接使用criteria: getCriteriaByIds(state.props.object.criteria),似乎该对象等于前一个状态对象(因此该对象可以是未定义的)。

我确信必须有一种更简单的方法来获取标准,而不会在代码中重复过多。

注意

getObjectByIdgetCriteriaByIds是基于Egghead.io上Colocating selectors with reducers course的选择器。

所以我的问题是

  

使用依赖于其他状态的推荐方法是什么   使用mapStateToProps时的属性?

2 个答案:

答案 0 :(得分:1)

我建议不要在mapStateToProps中做任何选择逻辑。每次更改任何状态时都会调用该函数,因此您的逻辑(getCriteriaByIds)将被调用很多。

我建议将objectId作为顶级状态条目(可以使用独立的reducer),这样您就可以从状态对象中获取它。对critetia采用相同的方法。

我的建议由best practices to keep your Redux state as flat (normalized) as possible支持,即使你在那里会有一些重复

答案 1 :(得分:1)

在使用mapStateToProps"时,我没有任何有用的东西来添加"推荐的方法来处理其他状态属性的依赖关系,但我认为只需添加一个本地变量将有助于重复。

const mapStateToProps = (state, props) => {
  let object = getObjectById(state, props.routeParams.objectId);
  return {
    object,
    criteria: getCriteriaByIds(state, object ? object.criteria : [])
  };
};

如果您不希望object成为undefined,则可以进一步简化为

const mapStateToProps = (state, props) => {
  let object = getObjectById(state, props.routeParams.objectId);
  return {
    object,
    criteria: getCriteriaByIds(state, object.criteria || [])
  };
};