Reactjs 状态已更改,但渲染时间不为';我没有再打电话来
减速器Reactjs 状态已更改,但渲染时间不为';我没有再打电话来,reactjs,redux,Reactjs,Redux,减速器 我发现chrome redux开发工具中的状态已经改变,但是视图没有更新,然后当我使用返回{…state}视图是更新的,我不明白。当你看到你的redux商店更新,但没有看到组件重新渲染器时,您首先应该做的事情之一是检查您的状态对象是否正在发生变化 根据关于extend的jquery文档: 首先将两个或多个对象的内容合并到中 对象 请注意,在代码中: ` saveEnd(state, action){ let data = action.payload; let data1 = {
我发现chrome redux开发工具中的状态已经改变,但是视图没有更新,然后当我使用
返回{…state}
视图是更新的,我不明白。当你看到你的redux商店更新,但没有看到组件重新渲染器时,您首先应该做的事情之一是检查您的状态对象是否正在发生变化
根据关于extend的jquery文档:
首先将两个或多个对象的内容合并到中
对象
请注意,在代码中:
`
saveEnd(state, action){
let data = action.payload;
let data1 = {};
data1['' + data.platform] = {};
data1['' + data.platform]['' + data.type] = data;
$.extend(true, state.serCfgData, data1);
return state
}
`
您正在修改状态对象,而不是它的副本。
您可以这样做以避免状态发生变化:
// jQuery.extend( [deep ], target, object1 [, objectN ] )
$.extend(true, state.serCfgData, data1);
请注意,当您返回{…state}
时,它更新的原因是您正在返回一个新对象(Spread操作符创建一个新对象)
请观看此视频,了解如何避免减速器中的对象突变:
是的,这是正确的。另请参阅Redux文档中关于意外突变和正确更新数据的信息:和。另外,还有一点需要注意:对象扩展操作符是阶段3,不是ES6,但是ES6确实有
object.assign()
。不管怎样,这些都是常用的,而不是$。extend
。啊,这是正确的,我将更新我的答案以反映阶段3而不是ES6。谢谢,我使用了对象。assign()
,但这种方法在深层对象中不起作用是的,对象。assign
是一种浅层合并。“Immutable Update Patterns”链接给出了使用浅层合并以及其他可能方法进行嵌套更新的示例。我真的不确定$.extend()
是否真的进行了正确的不可变更新,或者如果您为“deep”标志传递true
。
...
...
// Babel Stage 3 spread operator
const newState = {...state};
$.extend(true, newState.serCfgData, data1);
return newState;