Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 反应状态扩展多级对象不工作_Javascript_Reactjs_Ecmascript 6 - Fatal编程技术网

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是如何呈现组件的,这是一个很长的故事,但是,如果将此代码移到
渲染
函数的某个事件处理程序之外,一切都会正常工作。上述代码示例的结果仍然相同。是的,我有几个毫秒的调用一个接一个地更新同一个对象,我想一旦它更新了一次,它就不会与其他对象合并。。因为它更新了最后的合并值。您能提供更多的代码,显示您执行这些调用的方式吗?