由于 React 的异步特性setState
以及经过大量研究后新引入的react 并发模式,我不知道在以下场景或任何其他场景中如何访问保证的最新状态。
非常感谢 React 专家的回答,尤其是来自 React 团队的回答。
请记住,这是一个非常简单的示例,真正的问题可能发生在一个充满状态更新、事件处理程序、改变状态的异步代码的复杂项目中,......
import { useCallback, useState } from "react";
const Example = ({ onIncrement }) => {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
onIncrement(count, count + 1); // Is count guaranteed to be the latest state here due to including count in the useCallback dependency array?
setCount((count) => count + 1);
}, [count, onIncrement]);
return (
<>
<span>{count}</span>
<button onClick={increment}>increment</button>
</>
);
};
const Parent = () => (
<Example
onIncrement={(currentCount, incrementedCount) =>
console.log(
`count before incrementing: ${currentCount}, after increment: ${incrementedCount}`
)
}
/>
);
export default Parent;
你可能会说我可以onIncrement
在setCount
回调中调用,但是由于新的反应并发模式,你可以看到将来反应更新onIncrement
可能会被调用两次并输出两次结果,这不是预期的结果。
提交阶段通常非常快,但渲染可能很慢。出于这个原因,即将到来的并发模式(默认情况下尚未启用)将渲染工作分成几部分,暂停和恢复工作以避免阻塞浏览器。这意味着 React 可能在提交之前多次调用渲染阶段生命周期,或者它可能在根本不提交的情况下调用它们(因为错误或更高优先级的中断)。
您已经可以(React 17 严格模式)看到onIncrement
在开发模式和 React 并发模式成为默认后的特性中将调用两次,因此在生产中可能会以这种方式调用两次。
在useCallback
依赖项数组中包含 count 是否可以保证 count 是最新的状态值?
onIncrement
您可能会建议在挂钩中调用,useEffect
但这样我将无法访问以前的状态,与此示例不同,它可能无法重新计算。(使用 ref 存储先前的状态不是解决方案)
使用的另一个问题useEffect
是我不确定这个事件处理程序(onIncrement)是效果的原因还是另一个处理程序中的状态更改或useEffect
回调导致了效果。(存储额外的状态或参考来检测原因是多余的)
谢谢!