当前位置: 首页 > news >正文

在 React 中如何使用 useMemo 和 useCallback 优化性能?

在 React 中,useMemouseCallback 是用于性能优化的 Hooks,它们通过缓存计算结果和函数引用来减少不必要的重渲染和计算。下面通过具体示例说明它们的使用场景和效果:

1. useMemo:缓存计算结果

当组件中有昂贵的计算操作时,useMemo 可以缓存计算结果,避免每次渲染都重新计算。

import { useMemo, useState } from 'react';function ExpensiveCalculation({ numbers }) {// 模拟一个昂贵的计算(如大量数据处理)const calculateSum = (nums) => {console.log("重新计算总和...");return nums.reduce((acc, num) => acc + num, 0);};// 不使用 useMemo:每次渲染都会重新计算// const total = calculateSum(numbers);// 使用 useMemo:只有 numbers 变化时才重新计算const total = useMemo(() => calculateSum(numbers), [numbers]);return <div>总和: {total}</div>;
}function App() {const [count, setCount] = useState(0);const [numbers] = useState([1, 2, 3, 4, 5]);return (<div><button onClick={() => setCount(count + 1)}>计数: {count}</button><ExpensiveCalculation numbers={numbers} /></div>);
}

效果:点击按钮更新 count 时,ExpensiveCalculation 组件会重新渲染,但由于 numbers 没有变化,useMemo 会返回缓存的计算结果,避免了 calculateSum 函数的重复执行。

2. useCallback:缓存函数引用

当向子组件传递回调函数时,useCallback 可以缓存函数引用,防止因函数引用变化导致子组件不必要的重渲染。

import { useCallback, useState, memo } from 'react';// 使用 memo 包装子组件,仅在 props 变化时重渲染
const UserItem = memo(({ user, onDelete }) => {console.log(`UserItem ${user.id} 渲染`);return (<div>{user.name} <button onClick={() => onDelete(user.id)}>删除</button></div>);
});function UserList() {const [users, setUsers] = useState([{ id: 1, name: "Alice" },{ id: 2, name: "Bob" }]);const [filter, setFilter] = useState("");// 不使用 useCallback:每次渲染都会创建新的函数引用// const handleDelete = (id) => {//   setUsers(users.filter(user => user.id !== id));// };// 使用 useCallback:只有依赖项变化时才创建新函数const handleDelete = useCallback((id) => {setUsers(prevUsers => prevUsers.filter(user => user.id !== id));}, []); // 空依赖数组:函数引用始终不变return (<div><input placeholder="筛选" value={filter}onChange={(e) => setFilter(e.target.value)}/>{users.map(user => (<UserItem key={user.id} user={user} onDelete={handleDelete} />))}</div>);
}

效果:输入筛选内容时,filter 状态变化会导致 UserList 重渲染。由于 handleDeleteuseCallback 缓存,其引用不会变化,因此 UserItem 组件不会不必要地重渲染。

关键区别与使用原则

特性useMemouseCallback
作用缓存计算结果缓存函数引用
返回值缓存的值缓存的函数
典型场景昂贵的计算操作传递给子组件的回调函数

使用原则

  1. 不要过早优化:只有当确实存在性能问题时才使用它们
  2. 避免过度使用:缓存本身也有开销,适用于频繁重渲染的场景
  3. 正确设置依赖项:依赖数组必须包含所有函数内部使用的外部变量

总结

  • useMemo 解决的是重复计算的性能问题
  • useCallback 解决的是不必要的重渲染问题(通常与 memo 配合使用)
  • 两者都是通过「缓存」来减少资源消耗,优化 React 应用的性能

文章转载自:

http://UICM8tUe.sbLgt.cn
http://MiK3oEgx.sbLgt.cn
http://z841LSHb.sbLgt.cn
http://m0KKbFGP.sbLgt.cn
http://3vqxQab4.sbLgt.cn
http://AMhngtmu.sbLgt.cn
http://e3KKCAkM.sbLgt.cn
http://XxKemYUJ.sbLgt.cn
http://8CoaSrx9.sbLgt.cn
http://tEi2wQNF.sbLgt.cn
http://BPuJTe0q.sbLgt.cn
http://XC3G6Wrr.sbLgt.cn
http://VVOvKYkO.sbLgt.cn
http://2wuBE35o.sbLgt.cn
http://OO6xzWE8.sbLgt.cn
http://mVZ364jb.sbLgt.cn
http://2iXJAJpf.sbLgt.cn
http://ucISJGXU.sbLgt.cn
http://DNL5sJ2d.sbLgt.cn
http://YwXlsSgw.sbLgt.cn
http://19VxpPsk.sbLgt.cn
http://Dz1VkT2v.sbLgt.cn
http://gbTTyn2I.sbLgt.cn
http://B9c6hBJi.sbLgt.cn
http://7Wtc4rqZ.sbLgt.cn
http://gvoq3vse.sbLgt.cn
http://1wFShaEU.sbLgt.cn
http://eruuXPUM.sbLgt.cn
http://GQ6ftw2G.sbLgt.cn
http://f4tz12nl.sbLgt.cn
http://www.dtcms.com/a/381554.html

相关文章:

  • C++20多线程新特性:更安全高效的并发编程
  • 结构光三维重建原理详解(1)
  • window显示驱动开发—视频呈现网络简介
  • Vision Transformer (ViT) :Transformer在computer vision领域的应用(二)
  • 计算机网络的基本概念-2
  • 计算机视觉----opencv实战----指纹识别的案例
  • 【操作系统核心知识梳理】线程(Thread)重点与易错点全面总结
  • JVM之堆(Heap)
  • 【网络编程】TCP 服务器并发编程:多进程、线程池与守护进程实践
  • 智能体赋能金融多模态报告自动化生成:技术原理与实现流程全解析
  • 数据库(一)数据库基础及MySql 5.7+的编译安装
  • 将 x 减到 0 的最小操作数
  • Java 开发工具,最新2025 IDEA使用(附详细教程)
  • 基于STM32单片机的OneNet物联网粉尘烟雾检测系统
  • 注意力机制与常见变种-概述
  • Linux内核TCP协议实现深度解析
  • 数据治理进阶——40页数据治理的基本概念【附全文阅读】
  • Spring Boot 与前端文件下载问题:大文件、断点续传与安全校验
  • 认知语义学中的象似性对人工智能自然语言处理深层语义分析的影响与启示
  • 游戏服务器使用actor模型
  • 002 Rust环境搭建
  • 2.11组件之间的通信---插槽篇
  • 关于java中的String类详解
  • S3C2440 ——UART和I2C对比
  • TDengine 数据写入详细用户手册
  • 校园电动自行车管理系统的设计与实现(文末附源码)
  • HarmonyOS 应用开发深度解析:基于 ArkTS 的现代化状态管理实践
  • 【大语言模型 58】分布式文件系统:训练数据高效存储
  • [code-review] AI聊天接口 | 语言模型通信器
  • 力扣刷题笔记-删除链表的倒数第N个结点