react18【系列实用教程】memo —— 缓存组件 (2024最新版)

memo 的语法

在这里插入图片描述
如上图所示,在react中,当父组件重新渲染时,子组件也会重新渲染,即便子组件无任何变化,通过 memo 可以实现对组件的缓存,即当子组件无变化时,不再重新渲染子组件,核心代码如下:

import { memo } from "react";
const MemoChild2 = memo(Child2);export default MemoChild2;

将需要缓存的组件作为 memo 函数的参数传入,并将 memo 函数的返回值对外导出即可。

不适用的情况

memo() 函数的本质是通过校验Props中数据的内存地址是否改变来决定组件是否重新渲染组件的一种技术。

所以,当父组件向子组件传递了对象/数组/函数等引用类型的数据时,即便给子组件添加了 memo ,依然会重新渲染,具体演示范例和解决方案详见 useMemo 和 useCallback 的使用教程。

完整范例代码

src/page/Index/Father.jsx

import { useState } from "react";
import Child1 from "./Child1.jsx";
import Child2 from "./Child2.jsx";export default function Father() {console.log("渲染父组件");const [num, setNum] = useState(0);function increase() {setNum(num + 1);}return (<div style={{ border: "1px solid", padding: "10px" }}><h1>父组件</h1><p>num的值为:{num}</p><button onClick={increase}>+1</button><Child1 /><Child2 /></div>);
}

src/page/Index/Child1.jsx

function Child1() {console.log("渲染子组件1");return (<div style={{ border: "1px solid", padding: "10px", margin: "10px" }}><h1>子组件1</h1></div>);
}export default Child1;

src/page/Index/Child2.jsx

import { memo } from "react";function Child2() {console.log("渲染子组件2");return (<div style={{ border: "1px solid", padding: "10px", margin: "10px" }}><h1>子组件2(添加了 memo 缓存)</h1></div>);
}const MemoChild2 = memo(Child2);export default MemoChild2;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12875.shtml

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

相关文章

Python 简易图书管理系统

## 环境准备 确保你已经安装了 Python 和 Flask。同时&#xff0c;安装 SQLAlchemy 作为 ORM 工具&#xff0c;以及 Flask-Migrate 用于数据库迁移。 bash pip install Flask pip install Flask-SQLAlchemy pip install Flask-Migrate ## Flask 应用结构 我们的 Flask 应…

【深度学习】Diffusion扩散模型的逆扩散问题

1、前言 上一篇&#xff0c;我们讲了Diffusion这个模型的原理推导。但在推导中&#xff0c;仍然遗留了一些问题。本文将解决那些问题 参考论文&#xff1a; ①Variational Diffusion Models (arxiv.org) ②Tutorial on Diffusion Models for Imaging and Vision (arxiv.org…

迭代的难题:敏捷团队每次都有未完成的工作,如何破解?

各位是否遇到过类似的情况&#xff1a;每次迭代结束后&#xff0c;团队都有未完成的任务&#xff0c;很少有完成迭代全部的工作&#xff0c;相反&#xff0c;总是将上期未完成的任务重新挪到本期计划会中&#xff0c;重新规划。敏捷的核心之一是“快速迭代&#xff0c;及时反馈…

ubuntu20.04 ROS 环境下使用速腾80线激光雷达

1.相关系统环境 系统版本:ubuntu 20.04 ROS版本&#xff1a;ROS1 - noetic 激光雷达型号&#xff1a;RoboSense Ruby &#xff08;更新于2024.5.14&#xff09; 2.网口配置&#xff1a; 将PC/工控机的网口配置为&#xff1a; ipv4&#xff0c;方式设置为手动 ip地址、掩码以…

LGadb找不到设备,解决方法:安装驱动

解决方法&#xff1a;安装驱动 https://www.123pan.com/s/Z6tFjv-JqiPv.html提取码:6666

基于springboot实现社区智慧养老监护管理平台系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现社区智慧养老监护管理平台系统演示 摘要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的…

EE-SX670 槽型光电开关 5MM 限位检测感应器 使用案例

EE-SX670是一款槽型光电开关&#xff0c;也被称为U形传感器或限位检测感应器。它是光电传感器中的一种&#xff0c;通过检测物体是否插入其感应槽来触发开关。这种传感器通常用于自动化生产线上的位置检测、对象计数以及安全设备中的运动检测。 EE-SX670作为一款高性能的光电传…

Redis教程(四):Redis中String类型的常用命令

String操作&#xff1a; 插入一个key为name&#xff0c;值为apple的数据 set name apple 插入的数据中如果有空格的数据&#xff0c;请用""双引号&#xff0c;否则会报错&#xff01; set name "hello world!" 如果key为name的数据不存在&#xff0c;…

谷歌外贸seo优化怎么做?

一般有两种选择&#xff0c;在大型电商平台开展业务&#xff0c;如亚马逊&#xff0c;阿里巴巴等平台&#xff0c;也可以选择搭建自己的独立站 选择在大型电商平台可以方便迅速建立起自己的商铺&#xff0c;不需要考虑太多交易&#xff0c;支付&#xff0c;物流等方面的问题&am…

非阻塞模式下的读写操作

实现文件IO的非阻塞模式的读写操作 fcntl函数 功能&#xff1a; #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); // arg表示可变参数&#xff0c;由cmd决定 fcntl()对打开的文件描述符fd执行下面描述的操作之一。操作由cmd决…

MybatisPlus拓展功能(内附全功能代码)

目录 代码生成 静态工具 案例 逻辑删除 枚举处理器 ​编辑 Json处理器 分页插件功能 ​编辑 案例 封装转换方法 代码生成 静态工具 案例 Overridepublic UserVO queryUserAndAddressById(long id) { // 1.查询用户User user getById(id);if (user null || …

mobarxtem应用与华为设备端口绑定技术

交换机端口绑定 华为交换机的基础配置与MOBAXTERM终端连接 实验步骤&#xff1a; 一、给每个交换机划分vlan并添加端口 1.单个vlan的划分 2.批量划分vlan 在高端交换机CE6800上批量划分连续编号的VLAN&#xff0c;本例中连续的vlan20到vlan25 [~CE6800]vlan b 20 to 25 3…

折叠表达式

C11引入了折叠表达式&#xff08;fold expressions&#xff09;&#xff0c;这是一种强大的语言特性&#xff0c;用于在编译时处理参数包中的多个元素。折叠表达式通过使用折叠运算符&#xff08;fold operator&#xff09;来对参数包中的元素执行折叠操作。折叠运算符有三种形…

什么是用户画像?用户画像的作用是什么?

首先我们来说下什么是用户画像&#xff1f; 用户画像是指对目标用户进行详细描述和分类的方法。 它是根据用户的个人特征、行为习惯、兴趣爱好、消费习惯等信息进行分析和总结&#xff0c;以便更好地了解用户需求和行为模式。用户画像可以帮助企业或组织更好地了解他们的目标…

workerman 实现推送实时数据到前端

首先要说明一下,实时推送是有两个socket服务端和两个socket的客户端 我们分别起名叫做 外层服务端 (开启服务主进程 创建一个 websoket 连接)ws:// 内层服务端 (在开户主进程的时候,内部又创建的一个 socket)text:// 外层客户端 (这是由前端的用户端 使用js 创建的一个 w…

论文阅读 - Anatomy of an AI-powered malicious social botnet

论文链接&#xff1a; https://arxiv.org/pdf/2307.16336.pdf 目录 摘要 1引言 2 相关工作 2.1 LLM驱动的网络威胁 2.2 LLM生成的内容检测 2.3 社交机器人检测 2.4 由 LLM 增强的机器人 3 Fox8僵尸网络的识别 4 特性 4.1 配置文件 4.2 社交网络 4.3内容类型 4.4放…

lightdb plorasql存储过程支持SQLCODE和SQLERRM

文章目录 背景用法总结 背景 LightDB PLOraSQL存储过程在执行异常时支持通过sqlcode和sqlerrm拿到错误码和错误信息&#xff0c;这点与Oracle是类似的。但是在Oracle中存储过程未执行异常也能获取到错误码和错误信息&#xff0c;而LightDB会找不到对应的变量。因此计划在24.2版…

性能测试学习二

瓶颈的精准判断 TPS曲线 tps图 响应时间图 拐点在哪里呢? 这是一个阶梯式增加的场景,拐点在第二个压力阶梯上就出现了,因为响应时间增加了,tps增加的却不多,在第三个阶段时,tps增加的就更少了,响应时间也在不断增加,所以性能瓶颈在加剧,越往后越明显【tps的增长,…

Windows下编译RTTR

虽然C11引入了RTTI、Metaprogramming 等技术&#xff0c;但C在Reflection编程方面依旧功能有限。在社区上&#xff0c;RTTR则提供了一套C编写的反射库&#xff0c;补充了C在Reflection方面的缺陷。 零、环境 操作系统Windows 11Visual StudioVisual Studio Community 2022 CMa…

C++ STL概念之 迭代器

什么是迭代器 迭代器&#xff08;Iterator&#xff09;是一个在容器中访问元素的对象&#xff0c;提供了一种方法来顺序访问容器中的元素&#xff0c;而无需暴露容器的底层表示。 或者说 行为像指针一样的类型。可能是指针也可能是被类封装的指针&#xff0c;不关注容器底层细…