【发布时间】:2020-12-09 16:33:20
【问题描述】:
我正在使用功能组件。我知道setColor 会异步更改color 的值。但是,我的回调函数没有收到color(蓝色)的更新版本,即使它在color 更新后执行良好也是如此。这是我的代码的抽象版本:
let [color, setColor] = useState("red");
useEffect(() => {
setColor("blue");
setTimeout(() => {
console.log(color);
}, 5000)
}, []);
(这里是一个沙盒:https://codesandbox.io/s/falling-cherry-17ip2?file=/src/App.js)
我唯一的猜测是setColor 函数几乎创建了一个新的color 变量,而console.log 被困在引用旧的color。
疑难解答
-
我知道辅助
useEffect有可能在状态更改时执行我的回调。但是,这很不方便,因为我正处于复杂逻辑的中间,我只希望回调在某些条件下执行。 -
我也知道
useRef变量会立即更新,因此这是一个替代方案。
尽管如此,问题仍然存在:为什么没有记录 color 的更新值以及我可以在主 useEffect 中做些什么来访问最新版本的 color 状态?
【问题讨论】:
-
你想达到什么目的?
-
它已更新为蓝色,但正如昆汀在他的回答中解释的那样,当 setTimeout 被实例化时,您正在记录渲染中的状态值。只需将
console.log移出 useEffect 即可。
标签: javascript reactjs react-hooks