我在我的商店中存储了一个数组,但是我的mapStateToProps没有检测到更改,并且更新了props。这是我的商店:
const INITIAL_STATE =
{
someArray:[]
};
这是我的mapStateToProps。
function mapStateToProps(state){
return{
someArray: state.publications.someArray
}
}
如果我添加一些东西来检测长度变化,它确实会检测到变化,但这显然是不正确的。我做错了什么?
function mapStateToProps(state){
return{
someArray: state.publications.someArray,
detectChange: state.publications.someArray.length
}
}
这是我的root reducer:
const rootReducer = combineReducers({
publications: PUBLICATIONS_REDUCER
});
这是触发的reducer开关:
case UPDATE_INDEX_HEADER_SORT_ARRAY:
return {...state, someArray: action.payload}
其中payload是数组。
答案 0 :(得分:0)
您的reducer将有效负载直接置于状态。国家在任何时候都应该是不变的。但该州的阵列也被其他地方引用。代码不包括在内,但我设想了两个选项之一。
选项一是你有一些挂在数组上的变量,修改它以添加或删除项目,然后调度一个动作将该数组置于该状态。
选项二是某些函数从状态读取publications
,继续推送,弹出或拼接此数组上的某些内容,然后调度操作以将该数组置于该状态。
在这两种情况下,你应该意识到一些事情:
Redux不会查看您的数组以查看是否有任何更改。为此,需要搜索数组,数组中的项以及所有子项和子子项,一直向下搜索。 Redux会因为所有比较而疲惫不堪。通过强制该状态是不可变的,Redux使其变得容易。它可以只是check if the array is the same object as before,因为如果是,那么整棵树必须是相同的。毕竟,如果树中任何地方的任何属性发生了变化,那么其父级也必须已经更改,一直到根状态。如果你违反了与Redux的契约并试图通过变异来欺骗它,然后在一个动作的帮助下存储这个变异,那么Redux就不会对此有所帮助。
另外,在减速器之外使用你的阵列和烦恼表明你可能还没有完全理解Redux背后的原因。你可能觉得这个动作/减速器业务有点过头了,你只想推送一些东西,或者设置一个深层嵌套的属性。然后通过发送令牌动作来通知Redux,以便Redux可以感觉它被包含在聚会中。
Redux并不想仅仅作为事后的想法。像SET_ENTIRE_STATE这样的行为违背了Redux的目的和理念。我们鼓励您制作许多动作类型和许多细粒度减速器。这赋予了Redux权力,它会以实物的形式回报你,因为它很乐意与你分享它的力量。最好的部分:Redux很谦虚,它会让你获得所有的荣誉。
那就是说,你可以理解的是,你因为不可改变的任务而让你心爱的命令式风格从你身上夺走了。这就是我写Redux-Schema的原因。它允许您使用命令式样式编码,同时仍然在任何地方使用Redux Way。