在 React Hooks 中切换布尔状态
Toggling boolean state in React Hooks
当我运行以下代码并点击按钮时,我设法触发了useEffect函数:
const { useState, useEffect } = React;
const Example = () => {
const [bool, setBool] = useState(false);
useEffect(() => {
console.log(bool);
}, [bool]);
return (
<button
type='button'
onClick={() => {
setBool(!bool);
setBool(!bool);
}}
>
Check
</button>
);
};
ReactDOM.render(
<Example />,
root
)
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>
然而,当我写:
const { useState, useEffect } = React;
const Example = () => {
const [bool, setBool] = useState(false);
useEffect(() => {
console.log(bool);
}, [bool]);
return (
<button
type='button'
onClick={() => {
setBool(true);
setBool(false);
}}
>
Check
</button>
);
};
ReactDOM.render(
<Example />,
root
)
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>
我知道 useEffect 函数没有被触发,因为 setBool 是异步的,React 合并了这些更改,所以最终状态没有改变(bool 仍然是 false)。
我的问题是,为什么 React 在我出现的 !bool 和 !bool 的情况下无法检测到它。
谢谢
在第一种情况下,您正在获取 bool
的 当前 值(无论该值可能是什么)并在将其设置为状态之前取反它。结果,状态被改变,所以useEffect
被触发。
在第二种情况下,您提供了一个硬编码值。如果bool
的值已经是false
,那么setBool(false)
不会对状态产生任何影响;因此,useEffect
不会被触发。
当我运行以下代码并点击按钮时,我设法触发了useEffect函数:
const { useState, useEffect } = React;
const Example = () => {
const [bool, setBool] = useState(false);
useEffect(() => {
console.log(bool);
}, [bool]);
return (
<button
type='button'
onClick={() => {
setBool(!bool);
setBool(!bool);
}}
>
Check
</button>
);
};
ReactDOM.render(
<Example />,
root
)
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>
然而,当我写:
const { useState, useEffect } = React;
const Example = () => {
const [bool, setBool] = useState(false);
useEffect(() => {
console.log(bool);
}, [bool]);
return (
<button
type='button'
onClick={() => {
setBool(true);
setBool(false);
}}
>
Check
</button>
);
};
ReactDOM.render(
<Example />,
root
)
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="root"></div>
我知道 useEffect 函数没有被触发,因为 setBool 是异步的,React 合并了这些更改,所以最终状态没有改变(bool 仍然是 false)。
我的问题是,为什么 React 在我出现的 !bool 和 !bool 的情况下无法检测到它。
谢谢
在第一种情况下,您正在获取 bool
的 当前 值(无论该值可能是什么)并在将其设置为状态之前取反它。结果,状态被改变,所以useEffect
被触发。
在第二种情况下,您提供了一个硬编码值。如果bool
的值已经是false
,那么setBool(false)
不会对状态产生任何影响;因此,useEffect
不会被触发。