Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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 React必须使用setTimeout调用才能正确更新视图_Javascript_Reactjs_Settimeout - Fatal编程技术网

Javascript React必须使用setTimeout调用才能正确更新视图

Javascript React必须使用setTimeout调用才能正确更新视图,javascript,reactjs,settimeout,Javascript,Reactjs,Settimeout,我正在对此文件进行修改,以将维度组件移出到父组件 我注意到一件奇怪的事情,我必须调用setTimeout(this.updateRows,0)而不是this.updateRows(),才能正确更新视图 知道为什么会这样吗?好的,setTimeout(551;,0)只是使函数调用异步(即允许并发执行以提高性能)。为什么这有助于正确渲染视图?我问这个问题是为了避免“巧合编程”。在这个例子中,它可能不是关于“并发执行”的,而是关于程序的。setTimeout调用从当前调用堆栈中删除函数执行,并向消息队

我正在对此文件进行修改,以将
维度
组件移出到父组件

我注意到一件奇怪的事情,我必须调用
setTimeout(this.updateRows,0)
而不是
this.updateRows()
,才能正确更新视图


知道为什么会这样吗?好的,
setTimeout(551;,0)
只是使函数调用异步(即允许并发执行以提高性能)。为什么这有助于正确渲染视图?我问这个问题是为了避免“巧合编程”。

在这个例子中,它可能不是关于“并发执行”的,而是关于程序的。
setTimeout
调用从当前调用堆栈中删除函数执行,并向消息队列中添加一个条目。在队列中的下一条消息开始执行之前,当前正在执行的堆栈将运行到完成

我不知道为什么在这个特定的实例中需要这样做-必须在当前堆栈中设置某种状态,
updateRows
才能产生所需的结果。

这是因为

由于您正在读取
updateRows
函数中的
this.state
,因此在实际更新状态之前,它不会工作。 像您那样使用
setTimeout
,是允许状态更新的一种方法<代码>设置状态将完成,然后在下一帧中执行更新操作

更好的方法是使用回调参数
setState

this.setState({dimensions: updatedDimensions}, () => {
  this.updateRows();
});
另一种选择是保留对象中的任何状态更改,并将其传递到函数中,而不是直接从
this.state
中读取,但这可能会导致更大的复杂性