为什么React的startTransition的行为与useDeferredValue有很大不同?

问题描述 投票:0回答:1

我的代码库中有一堆

useDeferredValue()
,我认为这对于并发模式来说已经足够了。然而,它并没有将渲染分割成小块。由
setState
包裹在
startTransition
中触发的渲染将渲染分成 5 毫秒的块。

在 React devtools 中,我看到由

setState
触发的渲染有
priority: immediate
。由
useDeferredValue
startTransition
+
setState
引起的渲染具有
priority: normal
。因此,很长一段时间,我都认为后两者是同一件事。

我尝试将所有

useDeferredValue
通话替换为以下内容:

function useDeferredValue2(val) {
  const [deferred, setDeferred] = useState(val);

  useEffect(() => {
    React.startTransition(() => {
      setDeferred(val);
    });
  }, [val]);

  return deferred;
}

在此更改之后,由

useDeferredValue2
引起的所有渲染现在都被分成 5 毫秒的块。事实证明它们非常不同。
useDeferredValue
和这个基本一样吗?:

function useDeferredValue3(val) {
  const [deferred, setDeferred] = useState(val);

  useEffect(() => {
    setDeferred(val);
  }, [val]);

  return deferred;
}

在React内部,

useDeferredValue
useDeferredValue2
useDeferredValue3
触发的渲染有什么区别?

javascript reactjs react-hooks
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.