这是 React 即将推出的 useEffectEvent
钩子的准确填充吗?它是否存在任何潜在问题?
我不确定的一部分是,在返回的函数用于任何其他效果之前是否保证已更新引用。我想我在这方面没问题,只要我从不在代码中的其他任何地方使用相当深奥的 useInsertionEffect
,但我想确认一下。
function useEffectEvent(callback) { const fnRef = useRef(null) useInsertionEffect(() => { fnRef.current = callback }) return (...args) => { return fnRef.current.apply(null, args) } }
我不认为 React 团队已经为
useEffectEvent
提出了官方的 polyfill(至少我还没有看到)。话虽如此,您可以在针对现已失效的
useEvent
的 RFC,最初使用useLayoutEffect
。在将事件与效果分离的早期版本中,Dan Abramov 展示了更新的版本看起来像这样(在文档中不再可见):这个polyfill使用
useInsertionEffect
。我相信这种选择的原因是插入效果是最先运行的 (与useLayoutEffect
和useEffect
相比)。因此,可以非常安全地假设在任何其他效果运行之前更新了引用。后来,
useEvent
的 RFC 是搁置和useEffectEvent
开始在文档中显示 。尽管如此,由于公开的行为是相同的,因此可以重用相同的polyfill来实现useEffectEvent
。请注意,使用这个polyfill,钩子会返回一个稳定的函数(感谢
useCallback(..., [])
),这可能不是必需的,但更简单(以防万一)消费者错误地将返回的函数添加到效果的依赖项中)。我想了解有关polyfill的更多信息,我已经在博客中介绍过它:查看新 React 文档中的 useEvent polyfill。