2017-02-20 75 views
1

减速状态发生了变化,但呈现不叫再

` 
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 
} 
` 

我找到状态的铬终极版已经改变了开发工具,但视图不更新,那么当我用return {...state}的视图是更新,我不明白。

回答

1

当您看到您的redux商店更新但没有看到组件重新渲染时,您应该做的第一件事之一是检查您的状态对象是否正在发生变异。

根据上延伸jQuery的文档:

合并两个或多个对象的内容一起放入第一 对象

注意,在你的代码:

// jQuery.extend([deep ], target, object1 [, objectN ]) 
$.extend(true, state.serCfgData, data1); 

你是变异状态的对象,而不是它的一个副本。 你可以做这样的事情,以避免变异状态:

... 
... 
// Babel Stage 3 spread operator 
const newState = {...state}; 

$.extend(true, newState.serCfgData, data1); 
return newState; 

注意,当你return {...state},它更新的原因是你是返回一个新的对象(传播运营商创建一个新的对象。)

看看这段视频,了解如何避免在减速对象突变:

https://egghead.io/lessons/javascript-redux-avoiding-object-mutations-with-object-assign-and-spread

+1

是的,这是正确的。另请参阅Redux文档中有关意外突变和正确更新数据的信息:http://redux.js.org/docs/faq/ReactRedux.html#react-not-rerendering and http://redux.js.org/ docs/recipes/redurs/ImmutableUpdatePatterns.html。此外,还有一些注意事项:对象扩展运算符是阶段3,而不是ES6,但ES6确实有'Object.assign()'。无论哪种方式,这些都是常用的,而不是'$ .extend'。 – markerikson

+0

啊,这是正确的,我会更新我的答案,以反映阶段3,而不是ES6。 –

+0

谢谢,我已经使用了'Object.assign()',但是这种方法在深度对象中不起作用 – taven

相关问题