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

使用 useMemo 和 React.memo 优化 React 组件渲染

在 React 中,性能优化是一个重要的主题,特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemoReact.memo 来优化子组件的渲染。

1. 组件结构

创建一个父组件,包含两个子组件:

  • MemoChild:使用 React.memo 进行优化。
  • ExpensiveChild:使用 useMemo 缓存。

示例:

import React, { useState, useMemo } from 'react';// 子组件,使用 React.memo
const MemoChild = React.memo(({ data }) => {console.log('MemoChild rendered');return <div>{data}</div>;
});// 子组件,使用 useMemo 缓存
const ExpensiveChild = ({ data }) => {console.log('ExpensiveChild rendered');return <div>{data}</div>;
};// 父组件
function Parent() {const [count, setCount] = useState(0);const [data, setData] = useState('Initial Data');// 使用 useMemo 来缓存 ExpensiveChildconst memoizedExpensiveChild = useMemo(() => {console.log('Calculating ExpensiveChild');return <ExpensiveChild data={data} />;}, [data]);return (<div><h1>Parent Component</h1><MemoChild data={`Count: ${count}`} />{memoizedExpensiveChild}<button onClick={() => setCount(count + 1)}>Increment Count</button><button onClick={() => setData('New Data')}>Update Data</button></div>);
}export default Parent;

2. 组件功能解析

MemoChild

  • 使用 React.memo 包裹,只有当其 data 属性变化时才会重新渲染。

ExpensiveChild

  • 普通的子组件,父组件使用 useMemo 来缓存其实例。
  • 只有当 data 属性变化时,useMemo 会重新计算并返回新的组件实例。

Parent

  • 管理两个状态:countdata
  • 点击“Increment Count”按钮时,只有 MemoChild 会更新,而 ExpensiveChild 的引用保持不变。
  • 点击“Update Data”按钮时,ExpensiveChild 会重新渲染,因为 data 发生了变化。

3. 运行结果

点击“Increment Count”按钮

  • count 状态更新,MemoChild 会重新渲染,控制台输出:
    MemoChild rendered
    
  • ExpensiveChild 不会重新渲染,控制台不会输出。

点击“Update Data”按钮

  • data 状态更新,ExpensiveChild 会重新渲染,控制台输出:
    Calculating ExpensiveChild
    ExpensiveChild rendered
    

4. useMemoReact.memo 对比:

useMemo

  • Hook钩子函数,用于缓存计算结果。只有当依赖项变化时,才会重新计算。
  • 使用useMemo 缓存 ExpensiveChild 实例,避免不必要的重新渲染。

React.memo

  • 高阶组件,缓存组件的渲染结果。只有当传入的 props 发生变化时,组件才会重新渲染。
  • 适用于根据 props 变化控制渲染的场景。

5. 渲染逻辑总结

基本数据类型(如 numberstringboolean

  • 当组件的 props 是基本数据类型时,如果其值未发生变化,React.memo 不会重新渲染组件。

引用数据类型(如 objectarray

  • 当组件的 props 是引用数据类型时,React.memo 会进行浅比较。
  • 如果引用相同,组件不会重新渲染;如果引用不同,组件会重新渲染。

6. 关键点

  • 基本数据类型的比较:只要值相同,组件不会重新渲染。
  • 引用数据类型的比较:如果引用相同,组件不会重新渲染;如果引用不同(无论内容是否相同),组件会重新渲染。
http://www.lryc.cn/news/497556.html

相关文章:

  • ISAAC SIM踩坑记录--添加第三方3D场景
  • Git 详解
  • Linux操作系统3-文件与IO操作1(从C语言IO操作到系统调用)
  • 【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接
  • Rancher V2.7.0安装教程
  • STM32MX 配置CANFD收发通讯
  • (12)时间序列预测之MICN(CNN)
  • 嵌入式蓝桥杯学习3 外部中断实现按键
  • 自由学习记录(29)
  • 使用YOLO系列txt目标检测标签的滑窗切割:批量处理图像和标签的实用工具
  • 架构10-可观测性
  • git管理Unity项目的正确方式
  • openssl使用哈希算法生成随机密钥
  • 将word里自带公式编辑器编辑的公式转换成用mathtype编辑的格式
  • 校园失物招领系统基于 SpringBoot:点亮校园归还遗失物之光
  • dhcpd服务器的配置与管理(超详细!!!)
  • Qml之基本控件
  • 【Java从入门到放弃 之 Stream API】
  • Ruby On Rails 笔记1——Rails 入门
  • 高效开发 Python Web 应用:FastAPI 数据验证与响应体设计
  • 基于“开源 2+1 链动 O2O 商城小程序”的门店拉新策略与流程设计
  • 33.5 remote实战项目之设计prometheus数据源的结构
  • 微服务springboot详细解析(一)
  • 深入探讨Go语言中的双向链表
  • Fastapi + vue3 自动化测试平台---移动端App自动化篇
  • ElasticSearch easy-es 聚合函数 group by 混合写法求Top N 词云 分词
  • 在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录
  • 2024年顶级小型语言模型前15名
  • 精通 Python 网络安全(一)
  • 【python自动化二】pytest集成allure生成测试报告