React.memo 是一个高阶组件,用于优化函数组件的渲染性能。

示例 1: memo 基本用法

点击按钮,观察两个子组件的渲染次数

无 memo

渲染次数: 1

name: 张三

有 memo

渲染次数: 1

name: 张三

// 无 memo:每次父组件更新都重渲染
function Child({ name }) { ... }

// 有 memo:props 不变时跳过渲染
const MemoChild = memo(function Child({ name }) { ... });

示例 2: 对象 props 陷阱

❌ 内联对象(每次都重渲染)

渲染次数: 1

✅ useMemo 缓存(只在颜色变时渲染)

渲染次数: 2

注意: 内联对象 { color } 每次渲染都是新引用, 导致 memo 失效。使用 useMemo 可以保持引用稳定。

示例 3: 函数 props 陷阱

❌ 内联函数

✅ useCallback

// ❌ 内联函数每次都是新引用
<Child onClick={() => doSomething()} />

// ✅ useCallback 保持引用稳定
const handler = useCallback(() => {
  doSomething();
}, []);
<Child onClick={handler} />

示例 4: 自定义比较函数

张三

ID: 1

更新: 7:39:15 AM

渲染次数: 1

const UserCard = memo(
  function UserCard({ user }) { ... },
  (prevProps, nextProps) => {
    // 只比较 id 和 name,忽略 lastUpdated
    return (
      prevProps.user.id === nextProps.user.id &&
      prevProps.user.name === nextProps.user.name
    );
  }
);
说明: 自定义比较函数让你决定何时重渲染。 "只更新时间戳"不会触发重渲染,"更新名字"才会。

示例 5: 列表项优化

  • 学习 React
    #1
  • 学习 TypeScript
    #2
  • 构建项目
    #3
优化效果: 切换一个项目时,只有该项目重新渲染, 其他项目保持不变(观察 # 编号)。这得益于 memo + useCallback。