在运行 run 函数时,我希望 value 变量的值为“ new”,但是即使500毫秒,它仍然保持“ old”状态。为什么会发生这种情况以及如何解决这个问题?
import React, { Component, useState } from "react";
import { render } from "react-dom";
function App() {
const [value, setValue] = useState('old');
const run = async() => {
setValue('new')
const data = await wait(500)
console.log(value)
}
return (
<button onClick={run}>
Run
</button>
);
}
render(<App />, document.getElementById("root"));
function wait(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
答案 0 :(得分:3)
setState异步运行,因此不会立即反映在功能代码块中。您可以尝试使用useEffect来监视状态的变化。
useEffect(() => console.log('value', value), [value])
答案 1 :(得分:0)
在您的情况下,const [value, setValue] = useState('old');
setValue只不过与类Components中的setState相同。因此,由于setState和setValue是异步函数,因此您永远无法预测何时更新值。
因此,您可以在类组件中使用componentDidUpdate
,也可以像useEffect
这样使用useEffect(() => callFn();, [value])
。所以这里的callFn()
是一个函数,将在值更新后调用。
希望有帮助。毫无疑问
答案 2 :(得分:0)
好的,这是我想发生的事情: 您单击按钮,它调用您的 run 函数-然后运行函数调用 setState 。