【React的useMemo钩子详解】

React 的 useMemo 钩子详解

useMemo 是 React 提供的一个性能优化 Hook,用于缓存计算结果,避免在每次渲染时都进行重复计算。

基本语法

javascript 复制代码
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  • 第一个参数:计算函数,返回需要缓存的值
  • 第二个参数:依赖项数组,当依赖项变化时才会重新计算

核心机制

  1. 缓存触发条件

    • 使用 Object.is 逐个比较依赖项
    • 任一依赖项变化 → 重新计算并缓存新值
    • 所有依赖项不变 → 直接返回缓存值
  2. 缓存存储方式

    • 存储在组件对应的 Fiber 节点
    • 组件卸载时缓存销毁
    • 空依赖数组 [] → 永久缓存

主要应用场景

1. 高性能计算优化

javascript 复制代码
const filteredList = useMemo(() => 
  hugeList.filter(item => item.value > threshold), 
[threshold, hugeList]);

2. 稳定引用类型

javascript 复制代码
const config = useMemo(() => ({ color: theme, size: "large" }), [theme]);

3. 避免子组件不必要渲染

javascript 复制代码
const MemoizedComponent = React.memo(Child);
function Parent() {
  const memoizedProps = useMemo(() => ({ onClick: handleClick }), []);
  return <MemoizedComponent {...memoizedProps} />;
}

与相关 Hook 的区别

特性 useMemo useEffect useCallback
执行时机 渲染阶段同步执行 浏览器绘制后异步执行 渲染阶段同步执行
主要用途 缓存计算结果 处理副作用 缓存函数引用
返回值 返回缓存值 无返回值 返回缓存函数
依赖数组作用 控制缓存更新 控制副作用触发 控制函数更新

注意事项

  1. 不要过度使用:仅在计算开销大或需要稳定引用时使用
  2. 引用类型比较 :默认使用浅比较,对于复杂对象可结合 JSON.stringify 或 Lodash 的 isEqual 实现深比较
  3. 组件内部使用useMemo 仅适用于单个组件内部,跨组件共享需使用状态管理库
  4. 引用稳定性useMemo 的真正价值在于保持数据引用的稳定性,而不仅是性能优化

代码示例

javascript 复制代码
function ComplexCalculation({ data }) {
  const result = useMemo(() => {
    console.log('重新计算');
    return data.reduce((acc, item) => acc + item.value, 0);
  }, [data]);

  return <div>总和: {result}</div>;
}

useMemo 是 React 性能优化的重要工具,但应合理使用,避免因过度优化导致代码复杂度增加。

相关推荐
章豪Mrrey nical5 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
程序员爱钓鱼6 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
PineappleCoder6 小时前
工程化必备!SVG 雪碧图的最佳实践:ID 引用 + 缓存友好,无需手动算坐标
前端·性能优化
JIngJaneIL7 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
敲敲了个代码7 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
澄江静如练_7 小时前
列表渲染(v-for)
前端·javascript·vue.js
JustHappy8 小时前
「chrome extensions🛠️」我写了一个超级简单的浏览器插件Vue开发模板
前端·javascript·github
Loo国昌8 小时前
Vue 3 前端工程化:架构、核心原理与生产实践
前端·vue.js·架构
sg_knight8 小时前
拥抱未来:ECMAScript Modules (ESM) 深度解析
开发语言·前端·javascript·vue·ecmascript·web·esm