#773·ink

useLayoutEffect 应立即执行

作者: jacob314创建于 2025年9月15日更新于 2026年2月25日

理想情况下,Ink 应该在 useLayoutEffect 完成后才渲染 UI 的一帧。不幸的是,并非如此,导致在使用 useLayoutEffect 触发的未变化的帧渲染后,紧接着使用 useLayoutEffect 进行的变化。对于依赖 useLayoutEffect 来在渲染一帧之前测量大小的应用程序(例如 Gemini CLI),这会导致在使用 useLayoutEffect 后,内容可见之前出现闪烁的帧。如果不是因为 Ink 需要支持 `<Static>`,这个问题就很容易解决。我们只需要等待所有待处理的 useLayoutEffect 完成后才渲染帧。这会破坏静态渲染,因为我们会错过渲染带有静态内容的帧。为了缓解静态渲染的问题,我们可以在单个帧中可能发生的多次布局过程中,先构建所有静态内容的缓冲区,然后在帧渲染完成后将其添加。或者,我们可以修改 `<Static>`,使其更加了解 Ink 内部,从而只在帧实际渲染完成后而不是仅在调用 useLayoutEffect 时剥离静态的子元素。

内容来源: vadimdemedes/ink