反应使用状态。为什么文档建议在设置状态时传递具有先前状态的函数?

React useState. Why do the docs advise passing a function with the previous state when setting the state?

在 React 文档 (https://reactjs.org/docs/hooks-reference.html#usestate) 中它说“如果新状态是使用以前的状态计算的,您可以将函数传递给 setState”,如下所示:

const [count, setCount] = useState(initialCount);
setCount(prevCount => prevCount + 1)

但是为什么 React 会建议将此作为解决方案,因为它可以像这样使用 count 变量更简洁地完成:

const [count, setCount] = useState(initialCount);
setCount(count + 1)

后一种方法即使在处理数组等可变对象时也适用,如本例所示:

https://codesandbox.io/s/6b-array-subcomp-event-usestate-props-r032xv

建议使用函数是因为您可以确保在其参数中获得可靠的先前状态。另一方面,如果您直接使用状态的值,则可能会发生您正在读取其陈旧值的情况,因为反应的 setState 操作是异步的并且可能仍未更新状态。

这是一个例子:

function App() {
  const [a, setA] = useState(0);
  const [b, setB] = useState(0);
  useEffect(() => {
    setA(a + 2);
    setA(a + 2);
  }, []);
  useEffect(() => {
    setB((prev) => prev + 2);
    setB((prev) => prev + 2);
  }, []);
  return (
    <div>
      <h1>{a}</h1>
      <h1>{b}</h1> 
    </div>
  );
}

a 将包含 2 因为 React 会同时执行两个 setA (批量更新)因此读取之前的状态 a 一次,此时为 0 .

然而,

b 将具有正确的值 4,因为它明确使用更新函数参数提供的先前状态。

如果您有一个使用 SetCount 两次的函数,而不使用前一个状态,它将只设置一次。

const [count, setCount] = useState(0);
const fun1 = () =>{
   setCount(count + 1)
   setCount(count + 1)
}
// it will change count to 1 rather than 2

这就是为什么建议使用上一个状态