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;