跳到主要内容

useCallback

React useCallback Hook 返回一个记忆回调函数

备注

将记忆化视为缓存一个值,这样它就不需要重新计算

这使我们能够隔离资源密集型功能,以便它们不会在每次渲染时自动运行

useCallback Hook 仅在其依赖项之一更新时运行

这可以提高性能

备注

useCallbackuseMemo Hooks 是相似的

主要区别在于 useMemo 返回一个记忆值,而 useCallback 返回一个记忆函数

您可以在 useMemo 章节中了解有关 useMemo 的更多信息


问题

使用 useCallback 的原因之一是防止组件重新渲染,除非它的 props 已经改变

在此示例中,您可能认为 Todos 组件不会重新呈现,除非 todos 发生变化:

备注

这是与 React.memo 部分中的示例类似的示例

实时编辑器
结果
Loading...

尝试运行它并单击计数增量按钮

你会注意到 Todos 组件会重新渲染,即使 todos 没有改变

为什么这不起作用? 我们正在使用 memo, 所以 Todos 组件不应该重新渲染,因为当计数增加时 todos 状态和 addTodo 函数都没有改变

这是因为所谓的“参照平等”

每次重新渲染组件时,都会重新创建其功能。 因此, addTodo 函数实际上发生了变化

解决方案

为了解决这个问题,我们可以使用 useCallback 钩子来防止函数被重新创建,除非有必要

使用 useCallback Hook 来防止 Todos 组件不必要地重新渲染:

实时编辑器
结果
Loading...

现在 Todos 组件只会在 todos 属性改变时重新渲染