useMemo或useCallback VS useRef的空依赖关系


9

在这个GitHub问题中,我基本上建议更改:

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

至:

x = useRef( ... ).current;

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

为此,有一个问题的答复:

有没有一种情况,没有依赖的useMemo或useCallback比useRef更好的选择?

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

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

Answers:


5

每个React Hooks API文档:

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

您可以在这里这里阅读更多有关它的信息


我猜这回答了问题,但是我怀疑这是不正确的。在沙盒React示例中,更改useCallback(x,[])useRef(x)相同。
伊扎基

useRef(x).current那是。
伊扎基

我希望我错了,但是我提出了一个为什么文档错误的理由
Izhaki

我不能完全肯定就useCallback(cb, [])VS useRef(cb).current自己。尽管从某种意义上说useMemo(cb, [])不同于“仅在其中一个依赖项已更改时才重新计算存储的值”。与无论如何总是重新计算值的关系。useRef(cb).currentuseMemouseRef
irasuna

useRef从不重新计算-它始终返回初始值。
伊扎基

1

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

另外,如果您使用它不会对性能造成太大影响 useCallback with empty dependency useUse或useRef,则不会有因为它不必执行任何繁重的比较。

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


1
谢谢。顾名思义,这是一个完全为空的依赖项。
伊扎基

1
@Izhaki我了解您的问题严格是空依赖关系,这就是为什么我提到空依赖关系没有任何区别的原因。但是,当您尝试添加更多更改时,可能需要大量重构
Shubham Khatri

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.