我偶然发现了一个对我来说非常奇怪的问题,但很可能很容易解释。
演示
让我们假设以下 React 组件
import React, { useState, useEffect, useCallback } from "react";
export default function App() {
const [test, setTest] = useState();
const doSomething = () => {
// TODO: Why does this returns the inital state value? Hoisting?
console.log(test);
};
const doSomethingWithCallback = useCallback(doSomething, [test]);
useEffect(() => {
setTest("asas");
window.setTimeout(() => doSomething(), 2000);
document.addEventListener("click", doSomethingWithCallback);
return () => {
document.removeEventListener("click", doSomethingWithCallback);
};
}, [doSomethingWithCallback]);
return (
<div className="App">
<h1>Click anywhere</h1>
</div>
);
}
(参见CodeSandbox)
问题
看一下TODO代码中的注释。
为什么控制台会记录最初设置的doSomething状态,即回调变体在调用时返回“真实”当前状态?testundefined
这是 React 正在做的某种提升或性能优化吗?
拉莫斯之舞
相关分类