我正试图理解这种奇怪的行为:
const [counter, setCounter] = useState<number>(1);
useEffect(() => {
setCounter(2);
setTimeout(function () {
console.log('counter = ', counter); // => counter = 1
}, 1000);
}, []);
当您的组件第一次安装时,您的效果将被调用,因为您正在传递deps的空数组。。。其中counter
变量为1
setCounter
函数是async
函数,react-native ui
会将该调用按顺序推入应该调用的函数调用堆栈,但推入该调用堆栈的第一个函数调用是您的console.log
,counter
变量的值是1
如果要打印counter
的更新值,请将counter
放入deps
的列表中,如:
const [counter, setCounter] = useState<number>(1);
useEffect(() => {
setCounter(2);
}, []);
useEffect(() => {
setTimeout(function () {
console.log('counter = ', counter); // => counter = 1
}, 1000);
}, [counter]);
值得一提的是,您正在useEffect中使用计数器状态值。这是ESLint使用默认设置的目标。您的useEffect取决于该状态,应该将其添加到依赖数组中。[ESLint错误][1]
正确使用useEffect会导致useTimeout运行2次。在初次渲染时和重新渲染后。[1] :https://i.stack.imgur.com/yiLJi.png