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)
,似乎该对象等于前一个状态对象(因此该对象可以是未定义的)。
我确信必须有一种更简单的方法来获取标准,而不会在代码中重复过多。
getObjectById
和getCriteriaByIds
是基于Egghead.io上Colocating selectors with reducers course的选择器。
使用依赖于其他状态的推荐方法是什么 使用
mapStateToProps
时的属性?
答案 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 || [])
};
};