在 React setState 钩子函数中传递值和传递回调有什么区别?
What's the difference between passing a value and passing a callback in a React setState hook function?
假设我使用 React hook 声明了一个本地状态 useState()
:
const [count, setCount] = useState(0);
稍后我想更新状态并触发重新渲染:
- 通过传值设置状态
<button onClick={() => setCount(count+1)}
- 通过回调设置状态
<button onClick={() => setCount((prev_count) => prev_count+1)}
这两种更新有什么区别?
- 传递回调将使您能够通过回调函数参数访问当前状态
setCount((curr_count) => curr_count+1)
。
- 如果您的状态更新是批处理的,使用
setCount(count+1)
中的状态值将为您提供陈旧状态,您可能会访问以前的状态。
在这里它没有任何区别,但是一旦您的应用程序变得更大并且您在许多地方使用了 count
,则有可能会发生多个 setState
调用并排队数据将呈现给 DOM,因此 count 的实际值可能与您的想法不同。
这正是建议在回调中使用先前状态的原因。 prevState
始终是一个可靠的解决方案,无需跟踪每个状态更新以了解 count
是什么。
假设我使用 React hook 声明了一个本地状态 useState()
:
const [count, setCount] = useState(0);
稍后我想更新状态并触发重新渲染:
- 通过传值设置状态
<button onClick={() => setCount(count+1)}
- 通过回调设置状态
<button onClick={() => setCount((prev_count) => prev_count+1)}
这两种更新有什么区别?
- 传递回调将使您能够通过回调函数参数访问当前状态
setCount((curr_count) => curr_count+1)
。 - 如果您的状态更新是批处理的,使用
setCount(count+1)
中的状态值将为您提供陈旧状态,您可能会访问以前的状态。
在这里它没有任何区别,但是一旦您的应用程序变得更大并且您在许多地方使用了 count
,则有可能会发生多个 setState
调用并排队数据将呈现给 DOM,因此 count 的实际值可能与您的想法不同。
这正是建议在回调中使用先前状态的原因。 prevState
始终是一个可靠的解决方案,无需跟踪每个状态更新以了解 count
是什么。