【发布时间】:2020-01-31 02:51:55
【问题描述】:
我正在查看 formik 中的代码,这显然是解决反应钩子过时关闭问题的一种方法。
function useEventCallback<T extends (...args: any[]) => any>(fn: T): T {
const ref: any = React.useRef();
// we copy a ref to the callback scoped to the current state/props on each render
useIsomorphicLayoutEffect(() => {
ref.current = fn;
});
return React.useCallback(
(...args: any[]) => ref.current.apply(void 0, args),
[]
) as T;
}
我在其他库中经常看到这种模式,但我不明白为什么它可以治愈它。
我不明白为什么在 useEffect() 中创建 ref 可以解决任何问题。
它会使 linter 静音吗?
【问题讨论】:
-
你的意思是这会治愈
react-hooks/exhaustive-deps规则?我想是因为useRef 返回一个object that will persist for the full lifetime of the component.。 linter 知道这一点,并且不会抱怨缺少作为 ref 的依赖项。但是即使您将 ref 添加为依赖项,它也不会为组件的生命周期重新创建返回值,因为永远不会重新创建 ref。 -
这样做会不会容易得多:
useCallback( () => console.log('never changes during comp lifecycle'), [] );或者您是否将闭包函数传递给 useEventCallback -
我发现这篇文章很有帮助。如果您有时间,请阅读所有内容,否则,请跳至第 9-12 级:medium.com/@sdolidze/the-iceberg-of-react-hooks-af0b588f43fb
-
@ArashMotamedi 这是一篇不错的文章,但没有解释此自定义挂钩带来的解决方案。创建一个在其闭包范围内具有状态的函数,该函数将更改该状态,而无需在每次更改状态时都创建新函数。
标签: reactjs typescript ref