useMemo或useCallback VS useRef的空依赖关系

时间:2019-11-11 23:31:48

标签: reactjs react-functional-component

在此GitHub issue中,我本质上建议更改:

x = useCallback( ... , []);

收件人:

x = useRef( ... ).current;

两者相同,但是使用useRef时,React不会比较依赖关系。

对此有一个问题的答复:

  

是否曾经有过这样一种情况,那就是无依赖的useMemo或useCallback比useRef更好的选择?

我想不出一个,但是我可能忽略了一些用例。

那么有人能想到这种情况吗?

3 个答案:

答案 0 :(得分:5)

每个React Hooks API文档:

  

请记住,当useRef的内容更改时,它不会通知您。   更改.current属性不会导致重新渲染 ...使用   回调引用可确保即使子组件显示了   稍后测量的节点(例如,响应点击),我们仍然可以   在父组件中收到有关此消息的通知,并可以更新   测量。

您可以详细了解herehere

答案 1 :(得分:0)

尽管您可以使用useRef来模拟useCallback或使用空的依赖项,但是您不能将其用于useCallback的所有可能情况,这些情况将在任何依赖项发生变化时进行补救。

此外,如果您使用useCallback with empty dependency或useRef,也不会带来太大的性能差异,因为它不必执行任何繁重的比较。

此外,如果您稍微更改了函数实现,以便必须在特定的参数更改时重新创建它,则可以简单地使用useCallback更新实现,并添加额外的参数作为依赖项。但是,如果使用useRef实现它,则必须还原为useCallback

答案 2 :(得分:0)

因为useRef(()=> {...})。current的输出 是易变的。

这会在您的代码中引起怪异的副作用。 我可以随时更改current的值。 https://codesandbox.io/s/confident-monad-vjeuw

这就是不想使用useRef

的用例