为什么startTransition会在没有状态变化的情况下也触发高优先级的更新和重新渲染?

前端开发 2026-07-10

我看到下面这段说法:说法:

调用 startTransition,即使在其中没有触发任何更新,也仍然会同时引发一个高优先级更新和一个低优先级更新

要验证这一点,请考虑下面的示例:

export default function App() {
  const [isPending, startTransition] = useTransition();

  console.log("render");
  // useDebug;

  return (
    <button onClick={() => startTransition(() => {})}>
      Start Transition
    </button>
  );
}

每次点击按钮都会引起重新渲染,尽管该Transition回调是空的。

这引发了一些问题:

  • 如果在 startTransition 内没有触发任何状态更新,为什么仍会发生重新渲染?
  • 这个重新渲染真的就是如前述所说的高优先级更新吗?
  • 如果调用 startTransition 仍然会触发紧急更新,难道不就有点违背了它被设计为低优先级工作的初衷吗?

所链接的博文使用了一个自定义的 useDebug 钩子,声称这种行为反映了高优先级更新,但我不确定这有多准确。

能否解释一下?

解决方案

为什么startTransition会在没有状态变化的情况下触发高优先级更新和重新渲染?

不过确实有一个“状态”变化。第一次重新渲染是由将 isPending 状态更新为 true 引起的,随后对于任何实际更新,又会进行一次低优先级的重新渲染。

来自React文档:https://react.dev/reference/react/useTransition#usage

为了向用户反馈正在进行的Transitions,isPending 状态在第一次调用 startTransition 时切换为true,并一直保持为 true,直到所有操作完成并向用户显示最终状态。

我真的无法对博文作者的主张,或他们的思路,做出评价;如果可能的话,直接和他们讨论可能会更有帮助。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章