当我递增时,警报会给出实际的numRef.current值,但stateNumber的值始终是前一个值。
我知道这是由于闭包造成的,但是即使我一直在阅读作用域和闭包的工作原理,我也不明白为什么在这种情况下stateNumber的值不是当前值,因为setStateNumber是在setTimeout之前调用的,所以这个值应该已经更新了
import React, { useState, useEffect, useRef } from "react";
const RefComponent = () => {
const [stateNumber, setStateNumber] = useState(0);
const numRef = useRef(0);
function incrementAndDelayLogging() {
setStateNumber(stateNumber + 1);
numRef.current++;
setTimeout(
() => alert(`state: ${stateNumber} | ref: ${numRef.current}`),
1000
);
}
return (
<div>
<h1>useRef Example</h1>
<button onClick={incrementAndDelayLogging}>delay logging</button>
<h4>state: {stateNumber}</h4>
<h4>ref: {numRef.current}</h4>
</div>
);
};
export default RefComponent;发布于 2019-07-22 15:00:44
function incrementAndDelayLogging() {
const newStateNumber = stateNumber + 1
setStateNumber(newStateNumber);
numRef.current++;
setTimeout(
() => alert(`state: ${newStateNumber} | ref: ${numRef.current}`),
1000
);}
这可能会解决这个问题:)
https://stackoverflow.com/questions/57135541
复制相似问题