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

news/2025/9/28 11:22:35/文章来源:https://www.cnblogs.com/wzzkaifa/p/19116329

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.mzph.cn/news/920571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集团网站制作公司用python做网站优点

来源&#xff1a;经济日报-中国经济网记者/梁 睿米磊建议创投和保荐机构从五个方面入手筛选“硬科技”企业&#xff1a;“围绕落实国家战略规划确定的科技发展方向或承担具体攻关任务的企业&#xff1b;拥有关键核心技术和先进技术的企业&#xff1b;科技创新和转化应用能力突出…

Gitee崛起:中国开发者迎来本土化研发平台新纪元

Gitee崛起:中国开发者迎来本土化研发平台新纪元 腾讯CODING DevOps服务的战略调整正在引发国内开发者生态的深刻变革。随着这一主流研发平台的逐步退出,中国软件产业正面临关键技术栈迁移的关键拐点。在这场转型浪潮…

湖北做网站教程哪家好上海知名的网站建设

在爱情中&#xff0c;不是每个男生都是幸运的&#xff0c;也不是每次的表白都是如你所愿的。有成功总有失败&#xff0c;成功是喜悦的&#xff0c;但是失败却是痛苦的。不过有的时候男生和女生表白以后&#xff0c;女生对男生说了这样的一段&#xff0c;其实我希望以后我们还是…

赣州做网站多少钱暴雪公司

解决神经网络过拟合问题—Dropout方法一、what is Dropout&#xff1f;如何实现&#xff1f;二、使用和不使用Dropout的训练结果对比一、what is Dropout&#xff1f;如何实现&#xff1f; 如果网络模型复杂&#xff0c;L2范数权值衰减方法就难以对付过拟合。这种情况下&#…

中国建设银行网站官网下载建设集团英文缩写

支付宝当面付官方接口文档&#xff1a;https://docs.open.alipay.com/194/105170/ 在弄清楚如何计算优惠之前先了解下相关金额参数&#xff1a; 1、请求中金额参数total_amount&#xff1a;订单总金额&#xff0c;订单总金额&#xff0c;单位为元&#xff0c;精确到小数点后两位…

关键领域软件研发知识管理的范式革命:从静态文档到智能图谱的跃迁

关键领域软件研发知识管理的范式革命:从静态文档到智能图谱的跃迁 在航空航天、金融科技和工业控制等关键领域,一场关于软件研发知识管理的静默革命正在上演。传统文档管理方式已无法满足现代软件工程对协作效率和知…

【IEEE出版、曾获中国科协认证】第六届机械工程、智能制造与自动化技术国际学术会议 (MEMAT 2025)

广东工业大学&东莞理工学院联合主办 第六届机械工程、智能制造与自动化技术国际学术会议 (MEMAT 2025) 2025 6th International Conference on Mechanical Engineering, Intelligent Manufacturing, and Automatio…

陕西建设厅八大员官方网站wordpress生成pdf

今日学习一下红外遥控的解码使用&#xff0c;红外遥控在日常生活必不可少&#xff0c;它的解码与使用也是学习单片机的一个小过程&#xff0c;我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理&#xff1a; 红外遥控特点&#xff1a; …

时间同步NTP服务

在企业的实际应用过程中,为了解决因各个主机的时间不一致导致的问题(数据的传送和处理发生混乱),那么就需要搭建NTP时间服务器来同步各个主机的时间。 这里同步的主要是软件时间,也即在linux当中可以通过date指令…

【WCH蓝牙系列芯片】-基于CH585开发板—IO口(GPIO)外部中断唤醒蓝牙睡眠模式

【WCH蓝牙系列芯片】-基于CH585开发板—IO口(GPIO)外部中断唤醒蓝牙睡眠模式--------------------------------------------------------------------------------------------------------------------------------…

DevExpress WinForms v25.2新功能预览 - 即将升级富文本编辑器控件功能

DevExpress WinForms v25.2新功能预览 - 即将升级富文本编辑器控件功能DevExpress WinForms 拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于…

网站建设的四个步骤网站建设岗位能力

​​​​下载 地址&#xff1a;https://nodejs.org/zh-cn/download/prebuilt-installer 安装包 开始安装 安装完成 给文件夹添加权限 创建两个文件夹 node_cache node_global 更新环境变量 修改环境变量&#xff0c;新的全局模块路径&#xff0c;这样在任何位置运行命令时都…

便宜做外贸网站天津网站建设流程

参考&#xff1a; https://www.cnblogs.com/kingsm/p/9849339.html 转载于:https://www.cnblogs.com/cwxwdm/p/10605529.html

linux怎么做网站有没有可以代理推广的平台

作者&#xff1a;老马引流定位&#xff1a;专业专注引流推广0X00 前言毫不客气的说&#xff0c;视频正日益成为社交媒体和营销的重要组成部分&#xff0c;有越来越多的人参与到视频剪辑当中来&#xff0c;而其中最为关键的就是视频剪辑软件。而市面上的视频剪辑软件当然也是五花…

做公众号的必备参考网站网站推广优化服务

好代码本身就是最好的文档。当你需要添加一个注释时&#xff0c;你应该考虑如何修改代码才能不需要注释。—— Steve McConnell目录字符串有很多操作函数&#xff0c;所以&#xff0c;这里我们专门用一节来介绍这些函数。建议&#xff1a;由于字符串函数较多&#xff0c;对于新…

网站建设的域名公司网站建设外包流程图

机器之心报道编辑&#xff1a;魔王、杜伟在近期举行的第 43 届国际信息检索年会 (ACM SIGIR2020) 上&#xff0c;Geoffrey Hinton 做了主题为《The Next Generation of Neural Networks》的报告。Geoffrey Hinton 是谷歌副总裁、工程研究员&#xff0c;也是 Vector Institute 的…

redis-事务操作

redis-事务操作redis事务本质上是一组命令的批处理,这组命令在执行过程中会被顺序性、一次性全部执行,只要没有出现语法错误, 这组命令在执行期间是不会被中断。 redis事务特性 redis事务仅保证了数据的一致性,不具…

【2025-09-26】奋斗逻辑

20:00让自己成为爱的磁铁,散发着温暖与光芒。用善良做你的引力,用宽容做你的磁场。吸引每一颗渴望爱的心,让他们感受到你的温柔给予,不要期待回报,因为爱本身就是最好的礼物。当你成为爱的源头,爱将如潮水般涌来…

【Linux基础知识系列:第一百四十篇】理解SELinux与系统安全 - 教程

【Linux基础知识系列:第一百四十篇】理解SELinux与系统安全 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

Elasticsearch 7.15索引模板介绍 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …