useCallback详解

20 阅读2分钟

useCallback 是 React 提供的一个 Hook,用于在函数组件中缓存(记忆化)回调函数,避免每次渲染都创建新的函数引用,从而优化性能,尤其是在将函数作为 props 传递给子组件时非常有用。

基本用法

import React, { useCallback } from 'react';

function MyComponent({ value, onChange }) {
  const handleClick = useCallback(() => {
    onChange(value + 1);
  }, [value, onChange]);

  return <button onClick={handleClick}>增加</button>;
}
  • 第一个参数:你想要缓存的函数。
  • 第二个参数:依赖项数组,只有当这些依赖发生变化时,函数才会被重新创建。

工作原理

  • 每次组件渲染时,useCallback 会检查依赖项数组。
  • 如果依赖项没有变化,useCallback 返回上一次缓存的函数引用。
  • 如果依赖项发生变化,useCallback 会生成一个新的函数引用。

适用场景

  • 将回调函数作为 props 传递给子组件:如果子组件使用了 React.memo 或 PureComponent,只有当 props 发生变化时才会重新渲染。使用 useCallback 可以保证函数引用不变,避免子组件不必要的重新渲染。
  • 依赖于特定状态或属性的回调:只有这些依赖发生变化时才需要重新创建函数。

与 useMemo 的区别

Hook作用返回内容
useCallback缓存函数引用,避免函数重复创建记忆化的函数
useMemo缓存计算结果,避免重复计算记忆化的值
  • useCallback(fn, deps) 相当于 useMemo(() => fn, deps)。

注意事项

  • 不要过度使用 useCallback。只有在函数频繁作为 props 传递给子组件,或依赖于性能优化时才需要使用,否则会增加代码复杂度。
  • 依赖项数组要准确,确保所有用到的外部变量都被正确列入依赖,否则可能导致逻辑错误。

总结

useCallback 的核心作用是缓存回调函数,保证函数引用的一致性,避免不必要的子组件重新渲染,从而提升 React 应用的性能。