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

实用指南:学习React-17-useMemo

React.memo

React.memo 是一个高阶组件(HOC),用于优化函数组件的渲染性能。它通过浅比较组件的 props 变化来决定是否重新渲染组件。如果 props 未变化,则复用上一次的渲染结果。

基本用法

将函数组件包裹在 React.memo 中即可:

const MyComponent = React.memo(function MyComponent(props) {
// 组件逻辑
});

或使用箭头函数:

const MyComponent = React.memo((props) => {
// 组件逻辑
});

自定义比较函数

默认情况下,React.memo 会对 props 进行浅比较。如果需要自定义比较逻辑,可以传入第二个参数:

const areEqual = (prevProps, nextProps) => {
// 返回 true 表示跳过渲染,false 表示重新渲染
return prevProps.value === nextProps.value;
};
const MyComponent = React.memo((props) => {
// 组件逻辑
}, areEqual);

适用场景

  • 组件渲染开销较大(如复杂计算或频繁渲染)。
  • 父组件频繁更新,但子组件的 props 未变化。
  • 纯展示型组件(无内部状态或副作用)。

注意事项

与类组件的区别

类组件类似的功能可通过 React.PureComponent 或手动实现 shouldComponentUpdate 实现。React.memo 是函数组件的等效优化手段。

小栗子

import React, {useState} from 'react';
import './index.css';
interface userCard {
name: string;
age: number;
phone: string;
}
// 未使用memo
// const Child = (props: {userData:userCard}) => {
// 使用memo
const Child = React.memo((props: {userData:userCard}) => {
// 将userData解构出来
const {userData} = props;
console.log('子组件渲染了');
return (
<div className='userCard'><p>{userData.name}</p><p>{userData.age}</p><p>{userData.phone}</p></div>)})export const App = () => {const [input, setInput] = useState('')const [user, setUser] = useState({name: '张三',age: 18,phone: '12345678901'})const handleBtnClick = () => {setUser({name: input,age: 18,phone: '12345678901'})}return (<div><inputtype="text"value={input}onChange={(e) => setInput(e.target.value)}style={{padding: '8px 12px',border: '1px solid #000',borderRadius: '4px',fontSize: '14px',marginRight: '8px'}}/><buttononClick={handleBtnClick}style={{padding: '8px 16px',backgroundColor: '#fff',color: '#000',border: '1px solid #000',borderRadius: '4px',cursor: 'pointer',fontSize: '14px'}}>更改数据</button><Child userData={user} /></div>)}export default App

结果如下:
在未使用memo时,只要state的值发生变化都会导致组件重新渲染,这样就很大程度上造成了资源的浪费。
请添加图片描述

使用memo之后,只有当子组件依赖的内容发生变化时才会重新去渲染。
请添加图片描述

useMemo

useMemo 是 React 中的一个 Hook,用于优化性能,通过缓存计算结果避免不必要的重复计算。它接受一个函数和依赖项数组,仅在依赖项发生变化时重新计算值。

useMemo 的语法

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  • 第一个参数:计算函数,返回需要缓存的值。
  • 第二个参数:依赖项数组,数组中的值变化时才会重新计算(类似于useEffect)。

useMemo 的适用场景

优化计算密集型操作
当组件中有高开销的计算(如复杂数学运算、大数据处理)时,useMemo 可以避免每次渲染都重新计算。

避免不必要的子组件渲染
结合 React.memo 使用,可以防止子组件因父组件无关状态更新而重复渲染。

缓存引用类型数据
对于对象或数组等引用类型,useMemo 可以避免每次渲染生成新引用,减少子组件的不必要更新。

useMemo 的注意事项

避免过度使用
useMemo 本身有性能开销,仅在高开销计算或引用稳定性关键时使用。简单计算可能得不偿失。

依赖项需明确
遗漏依赖项可能导致缓存值不更新,错误地使用旧值。确保依赖项完整且准确。

不用于副作用
useMemo 应用于纯计算逻辑,副作用(如数据请求、DOM 操作)应使用 useEffect

useMemo 与 useCallback 的区别

  • useMemo 缓存计算结果(如数值、对象)。
  • useCallback 缓存函数本身,避免函数引用变化。

代码示例

import React, { useMemo, useState } from 'react';
function Sum({ n }) {
// 使用useMemo(数据处理的方法, [依赖项]),只有当依赖项发生改变时才会重新执行数据处理方法  返回值:useMemo返回的时普通值
const total = useMemo(() => {
console.log('重新计算和');
return (n * (n + 1)) / 2;
}, [n]);
return <h1>1+2++{n} = {total}</h1>;}export default function App() {const [n, setN] = useState(5);const [v, setV] = useState(0);   // 与计算无关的状态return (<><Sum n={n} /><button onClick={() => setN(n + 1)}>n+1</button><button onClick={() => setV(v + 1)}>无关渲染 {v}</button></>);}

通过合理使用 useMemo,可以显著提升 React 组件的性能表现。

http://www.jsqmd.com/news/5365/

相关文章:

  • Gitee崛起:中国开发者迎来本土化研发平台新纪元
  • 关键领域软件研发知识管理的范式革命:从静态文档到智能图谱的跃迁
  • 【IEEE出版、曾获中国科协认证】第六届机械工程、智能制造与自动化技术国际学术会议 (MEMAT 2025)
  • 时间同步NTP服务
  • 【WCH蓝牙系列芯片】-基于CH585开发板—IO口(GPIO)外部中断唤醒蓝牙睡眠模式
  • DevExpress WinForms v25.2新功能预览 - 即将升级富文本编辑器控件功能
  • redis-事务操作
  • 【2025-09-26】奋斗逻辑
  • 【Linux基础知识系列:第一百四十篇】理解SELinux与系统安全 - 教程
  • Elasticsearch 7.15索引模板介绍 - 实践
  • 关于修改 linux 系统中优先使用中文结构
  • Discord桌面应用远程代码执行漏洞分析
  • DRL模型训练:原始奖励函数记录以及绘制
  • python的批量赋值语法
  • 中国DevOps平台竞品分析:安全合规与技术生态的双重较量
  • experiment 1
  • 图领域的METIS算法介绍 - zhang
  • 【Double】浮点数:精确的小数计算
  • CANOpen safety SRDO相关问题总结
  • Prometheus源码专题【左扬精讲】—— 监控系统 Prometheus 3.4.0 源码解析:head_wal.go 的 WAL 写入策略与缓存管理源码解读
  • 【Boolean】布尔值:逻辑判断的基础
  • 电子通信词汇中英文对照
  • 从“手机拆修”看懂POD与非POD的区别 - 教程
  • 完整教程:【有源码】基于Hadoop+Spark的AI就业影响数据分析与可视化系统-AI驱动下的就业市场变迁数据分析与可视化研究-基于大数据的AI就业趋势分析可视化平台
  • Tomcat中启用h3的方法是什么
  • k8s-Namespace
  • 国产化Excel开发组件Spire.XLS教程:C# 写入 Excel ,轻松将数据导出到工作表
  • 分布式专题——23 Kafka日志索引详解 - 指南
  • Agent的九种设计模式 - 详解
  • 牛客刷题-Day6