我是React的新手,正在学习useEffect hooks。在完成hooks课程后,我正在进行练习。
我有一个按钮来切换arrowState状态的变化。
export default function Test() {
const [arrowState, setArrowState] = useState(true);
const [arrowChange, setArrowChange] = useState(false);
const toggleButton = () => {
return setArrowState((arrowState) => {
return !arrowState;
});
};
return (
<>
<div>
<button
type="button"
onClick={toggleButton}
>
Toggle Arrow
</button>
</div>
{arrowChange && <Notific />}
</>
);
}
然后我有一个 useEffect 钩子,用于改变 arrowChange 的状态。同时设置了一个计时器,在 2 秒后将 arrowChange 的状态改为 false,从而自动隐藏该按钮。
useEffect(() => {
console.log("first line of useEffect.arrowChange is ", arrowChange);
setArrowChange(true);
console.log(
"immediately after setArrowChange to true. arrowChange is ",
arrowChange
);
setTimeout(() => {
console.log("first line of setTimeOut. arrowChange is ", arrowChange);
arrowChange && setArrowChange(false);
}, 1000);
return () => {
console.log("cleaning up arrowchange. arrowChange is ", arrowChange);
setArrowChange(false);
};
}, [arrowState]);
基于此,我将显示另一个带有消息的按钮。
function Notific() {
return (
<button
type="button"
onClick={() => setArrowChange(false)}
>
Arrow state has been changed
</button>
);
}
如您所见,我正在记录一些信息以查看效果。令人惊讶的是,即使在 useEffect hook 开始时将 arrowChange 设置为 true,在交替事件中它仍然显示为 false。
请查看这些控制台日志:
cleaning up arrowchange. arrowChange is false
Test.js:57 first line of useEffect.arrowChange is true
Test.js:59 immediately after setArrowChange to true. arrowChange is true
Test.js:65 first line of setTimeOut. arrowChange is true
Test.js:70 cleaning up arrowchange. arrowChange is true
Test.js:57 first line of useEffect.arrowChange is false
Test.js:59 immediately after setArrowChange to true. arrowChange is false
Test.js:65 first line of setTimeOut. arrowChange is false
Test.js:70 cleaning up arrowchange. arrowChange is false
Test.js:57 first line of useEffect.arrowChange is true
Test.js:59 immediately after setArrowChange to true. arrowChange is true
Test.js:65 first line of setTimeOut. arrowChange is true
Test.js:70 cleaning up arrowchange. arrowChange is true
Test.js:57 first line of useEffect.arrowChange is false
Test.js:59 immediately after setArrowChange to true. arrowChange is false
Test.js:65 first line of setTimeOut. arrowChange is false
Test.js:70 cleaning up arrowchange. arrowChange is false
Test.js:57 first line of useEffect.arrowChange is true
Test.js:59 immediately after setArrowChange to true. arrowChange is true
Test.js:65 first line of setTimeOut. arrowChange is true
useEffect
钩子的回调函数对状态有闭包。console.log
在遇到时会打印出该值,并且不会等待React更新状态后再记录信息。 - Sushanth --