Javascript 反应状态扩展多级对象不工作
声明默认值Javascript 反应状态扩展多级对象不工作,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,声明默认值 state = { moveType: { value: 0, open: false, completed: false } }; //回调以更新新状态 let step = 'moveType'; let val = 3; // new value let newObj = { ...this.state[step], value: val }; console.lo
state = {
moveType: {
value: 0,
open: false,
completed: false
}
};
//回调以更新新状态
let step = 'moveType';
let val = 3; // new value
let newObj = { ...this.state[step], value: val };
console.log(newObj);
this.setState({[step]: newObj }, function () {console.log(this.state);});
console.log(newObj)
正确显示新值,但此.state
仍显示旧值。。你能告诉我我做错了什么吗?在react中设置状态是非常敏感的事情。
我使用的最佳实践是始终手动控制对象深度合并,并使用this.setState(state=>{…return new state;})
调用类型,如本例所示:
this.setState(状态=>({
……国家,
[步骤]:{…(说明[步骤]|{}),…newObj},
}),()=>console.log(this.state))代码>根据文档,“setState()并不总是立即更新组件。它可能会批处理或延迟更新,直到稍后。”()@AnthonyKong,根据文档,“第二个参数是setState()
是一个可选的回调函数,在setState
完成并重新呈现组件后将执行该函数。“回调不应该包含新值吗?您的意思是console.log(this.state)代码>记录旧值?我很惊讶它竟然记录了一些东西。在回调内部,这个
并不是指react组件。@FelixKling,好的,将函数()
更改为()=>
或者使用self
而不是这个
-事情是一样的。Basil,react是如何呈现组件的,这是一个很长的故事,但是,如果将此代码移到渲染
函数的某个事件处理程序之外,一切都会正常工作。上述代码示例的结果仍然相同。是的,我有几个毫秒的调用一个接一个地更新同一个对象,我想一旦它更新了一次,它就不会与其他对象合并。。因为它更新了最后的合并值。您能提供更多的代码,显示您执行这些调用的方式吗?