13

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

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

至:

x = useRef( ... ).current;

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

对此有一个问题的答复:

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

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

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

4

3 回答 3

7

每个 React Hooks API 文档:

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

您可以在此处此处阅读有关它的更多信息。

于 2019-11-15T05:06:45.897 回答
1

虽然您可以使用 useRef 来模拟 useCallback 或使用空依赖项,但您不能将它用于所有可能的 useCallback 场景,即在任何依赖项更改时进行记忆。

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

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

于 2019-11-14T13:15:20.917 回答
0

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

这可能会在您的代码中导致奇怪的副作用。我可以随时更改电流值。 https://codesandbox.io/s/confident-monad-vjeuw

那将是不想使用 useRef 的用例

于 2019-11-18T10:54:17.563 回答