在这个GitHub问题中,我基本上建议更改:
x = useCallback( ... , []);
至:
x = useRef( ... ).current;
两者相同,但是使用useRef
React不会比较依赖关系。
为此,有一个问题的答复:
有没有一种情况,没有依赖的useMemo或useCallback比useRef更好的选择?
我想不出一个,但我可能忽略了一些用例。
那么有人能想到这种情况吗?
在这个GitHub问题中,我基本上建议更改:
x = useCallback( ... , []);
至:
x = useRef( ... ).current;
两者相同,但是使用useRef
React不会比较依赖关系。
为此,有一个问题的答复:
有没有一种情况,没有依赖的useMemo或useCallback比useRef更好的选择?
我想不出一个,但我可能忽略了一些用例。
那么有人能想到这种情况吗?
Answers:
每个React Hooks API文档:
请记住,useRef的内容更改时不会通知您。 更改.current属性不会导致重新呈现 ...使用回调ref可以确保即使子组件稍后显示了测得的节点(例如,响应单击),我们仍然会在父组件中收到有关它的通知。组件并可以更新测量值。
useRef(x).current
那是。
useCallback(cb, [])
VS useRef(cb).current
自己。尽管从某种意义上说useMemo(cb, [])
不同于“仅在其中一个依赖项已更改时才重新计算存储的值”。与无论如何总是重新计算值的关系。useRef(cb).current
useMemo
useRef
useRef
从不重新计算-它始终返回初始值。
尽管您可以使用useRef来模拟useCallback或使用空的依赖项,但是您不能将其用于useCallback的所有可能情况,这些情况将在任何依赖项发生变化时进行补救。
另外,如果您使用它不会对性能造成太大影响 useCallback with empty dependency
useUse或useRef,则不会有因为它不必执行任何繁重的比较。
同样,如果您稍微更改了函数实现,以便您必须在特定的参数更改中重新创建它,则可以简单地使用来更新实现,useCallback
并将额外的参数添加为依赖项。但是,如果使用useRef实现它,则必须还原到useCallback
因为useRef(()=> {...})。current的输出是可变的。
这会在您的代码中引起奇怪的副作用。我可以随时更改current的值。 https://codesandbox.io/s/confident-monad-vjeuw
那将是不想使用useRef的用例
x = useRef(value).current
永远不会返回可变的实例- ref
永远不会返回;current
是。与useCallback
版本相同。
useCallback(x,[])
为useRef(x)
相同。