React: memo

React.memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。

const MemoizedComponent = memo(SomeComponent, arePropsEqual?)

React 通常在其父组件重新渲染时重新渲染一个组件。你可以使用 memo 创建一个组件,当它的父组件重新渲染时,只要它的新 props 与旧 props 相同时,React 就不会重新渲染它。这样的组件被称为 记忆化的(memoized)组件。

一、未使用memo

1. 代码
import { useState } from "react";

// 未做memo记忆化之前
function Son() {
    console.log('子组件重新渲染');

    return (
        <>
            <div>子组件</div>
        </>
    )
}

function App() {
    const [count1, setCount1] = useState(0);

    return (
        <>
            <div>父组件:{count1} <button onClick={() => setCount1(count1 + 1)}>+</button></div>
            <Son />
        </>
    )
}

export default App;
2.运行效果

在这里插入图片描述

二、使用memo

1. 代码
import { memo,useState } from "react";

// 使用memo
const MemoSon = memo(function Son() {
    console.log('子组件重新渲染');

    return (
        <>
            <div>子组件</div>
        </>
    )
})

function App() {
    const [count1, setCount1] = useState(0);

    return (
        <>
            <div>父组件:{count1} <button onClick={() => setCount1(count1 + 1)}>+</button></div>
            <MemoSon />
        </>
    )
}

export default App;
2.运行效果

在这里插入图片描述

三、props的比较机制

在使用 memo 缓存组件之后,React会对 每一个prop 使用 Object.is 比较新值和老值,返回true,表示没有变化

  1. prop 是简单类型
    Object.is(3, 3) => true 没有变化

  2. prop 是引用类型(对象/数组)
    Object.is([], []) => false 有变化,React 只关心引用是否变化

四、 prop为引用类型,如何避免子组件重新渲染?

当prop为简单类型时很好理解,但当prop是引用类型时,即使prop的值内容不变,但是引用地址不同,也会触发重新渲染,如下示例:

1. 代码
import { memo, useState } from "react";

// 3. prop为引用类型
const MemoSon = memo(function Son({list}) {

    console.log('子组件再次渲染');

    return (
        <>
            <div>子组件:{list}</div>
        </>
    )
})

function App() {
    const [count1, setCount1] = useState(0);

    // 3. prop为引用类型
    const list = [1,2,3];

    return (
        <>
            <div>父组件:{count1} <button onClick={() => setCount1(count1 + 1)}>+</button></div>
            {/* 3. prop为引用类型 */}
            <MemoSon list={list} />
        </>
    )
}

export default App;
2. 效果

在这里插入图片描述

3. 使用useMemo 缓存list
	...
 	// 保证引用稳定 => useMemo 在组件渲染的过程中缓存一个值
    const list = useMemo(() => {
        return [1,2,3];
    }, []);
    ...
4. 效果

在这里插入图片描述

五、完整代码

import { memo, useMemo, useState } from "react";


// 1. 未使用memo
/* function Son() {

    console.log('子组件再次渲染');

    return (
        <>
            <div>子组件</div>
        </>
    )
} */

// 2. memo 记忆化后
/* const MemoSon = memo(function Son() {

    console.log('子组件再次渲染');

    return (
        <>
            <div>子组件</div>
        </>
    )
}) */

// 3. prop为引用类型
// 传递引用类型的 prop,比较的是新值和旧值的引用是否相等,当父组件的函数重新执行时,实际上形成的是新的引用
const MemoSon = memo(function Son({list}) {

    console.log('子组件再次渲染');

    return (
        <>
            <div>子组件:{list}</div>
        </>
    )
})

function App() {
    const [count1, setCount1] = useState(0);

    // 3.1 prop为引用类型 直接定义一个 list
    // const list = [1,2,3];

    // 3.2 prop为引用类型,使用 useMemo 缓存list
    // 保证引用稳定 => useMemo 在组件渲染的过程中缓存一个值
    const list = useMemo(() => {
        return [1,2,3];
    }, []);

    return (
        <>
            <div>父组件:{count1} <button onClick={() => setCount1(count1 + 1)}>+</button></div>
            {/* // 1. 未使用memo */}
            {/* <Son /> */}

            {/* // 2. 使用memo */}
            {/* <MemoSon /> */}

            {/* 3. prop为引用类型 */}
            <MemoSon list={list} />
        </>
    )
}

export default App;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阅读一些精华(老文献)

本文设置的初衷是诺贝尔化学奖得主Sir Fraser Stoddart说过&#xff1a;我们不能局限于最近几年的工作&#xff0c;而要往几十年前看&#xff0c;说不定因为之前的一些技术原因&#xff0c;导致当初的方法没有实现&#xff0c;现在可以实现了。 1.Variable-Rate Transmission f…

垃圾分类管理系统java项目

文章目录 垃圾分类管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 垃圾分类管理系统 一、项目演示 垃圾分类管理系统 二、项目介绍 系统角色&#xff1a;管理员、用户 1、登录、注册功能…

服务器之间实现免密码传输文件(scp免密传输)

问题&#xff1a;需要定时将本服务器的文件传输到指定服务器上作为备份 通过scp实现不同服务器之间的文件传输 正常使用scp传输文件 传输文件命令&#xff1a;scp /data/文件 root服务器地址&#xff1a;/指定目录 传输文件夹命令&#xff1a;scp -r /data/文件 root服务…

Unity与Andriod的交互

Unity与安卓的信息交互 这次分享的不同于传统的方式AndroidJavaClass("com.unity3d.player.UnityPlayer") 如果是新手的话&#xff0c;请看 交互新手教程 这里讲的是在Unity中调用java代码&#xff0c;或者在unity中传参到java中&#xff0c;在Java代码中运行。 以下…

css画三角形

使用border div {border-top: 50px solid yellowgreen;border-bottom: 50px solid deeppink;border-left: 50px solid bisque;border-right: 50px solid chocolate; }如果想要单个的三角形&#xff0c;把其它三边的颜色设为transparent即可 使用 conic-gradient 绘制三角形 …

ADS FEM 仿真设置

1、EM Simulator 选择FEM。 2、在layout界面打开的EM功能&#xff0c;这里不需要操作。 3、Partitioning 不需要操作。 4、没有叠层的话需要新建&#xff0c;过孔可以在叠层处右键添加。 5、端口需要设置GND layer。 6、设置仿真频率。 7、Output plan。 8、Options 设置 介质…

低空经济:无人机竞赛详解

无人机竞赛市场近年来呈现出蓬勃发展的态势&#xff0c;其市场价值不仅体现在竞赛本身&#xff0c;还体现在推动无人机技术创新、拓展应用场景以及促进产业链发展等多个方面。 一、比赛项目介绍 无人机竞赛通常分为多个项目&#xff0c;包括竞速赛、技巧赛、航拍赛等。每个项目…

LeetCode494:目标和

题目描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之…

GPT-4o:全面深入了解 OpenAI 的 GPT-4o

GPT-4o&#xff1a;全面深入了解 OpenAI 的 GPT-4o 关于 GPT-4o 的所有信息ChatGPT 增强的用户体验改进的多语言和音频功能GPT-4o 优于 Whisper-v3M3Exam 基准测试中的表现 GPT-4o 的起源追踪语言模型的演变GPT 谱系&#xff1a;人工智能语言的开拓者多模式飞跃&#xff1a;超越…

优秀博士学位论文分享:复杂场景下高精度有向目标检测的研究

优秀博士学位论文代表了各学科领域博士研究生研究成果的最高水平&#xff0c;本公众号近期将推出“优秀博士学位论文分享”系列文章&#xff0c;对人工智能领域2023年优秀博士学位论文进行介绍和分享&#xff0c;方便广大读者了解人工智能领域最前沿的研究进展。 “博士学位论…

牛客热题:二叉树与双向链表

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;二叉树与双向链表题目链接方法一…

【LInux】<基础IO> 文件操作 | 文件描述符 | 重定向

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

【easyX】动手轻松掌握easyX 1

01 简单绘图 在这个程序中&#xff0c;我们先初始化绘图窗口。其次&#xff0c;简单绘制两条线。 #include <graphics.h>//绘图库头文件 #include <stdio.h> int main() {initgraph(640, 480);//初始化640✖480绘图屏幕line(200, 240, 440, 240);//画线(200,240)…

NAT技术总结与双向NAT配置案例

NAT的转换方式&#xff1a; 1.静态转换&#xff1a;固定的一对一IP地址映射。 interface GigabitEthernet0/0/1 ip address 122.1.2.24 nat static global 122.1.2.1 inside 192.168.1.1 #在路由器出接口 公网地址 私网地址。 2.动态转换&#xff1a;Basic NAT nat address-gr…

centos7下使用docker安装fastdfs服务

先查看容器是否已经存在 docker ps -a 删除掉之前的tracker及storage服务 docker rm tracker docker rm storage 1、没有镜像先下载镜像 docker pull morunchang/fastdfs 2、运行服务 a、不指定物理服务器路径 docker run -d --name tracker --nethost morunchang/fastdfs sh…

【Linux】系统登录,调用shell,shell配置文件,shell命令,特殊符号,shell快捷键,Linux运行级别,解决无限登录问题,修改提示符

目录 Linux系统的登录方式 以及 调用shell Linux shell 以及 shell配置文件 shell 命令 shell 特殊符号 shell 快捷键 Linux操作系统运行级别 单用户模式下解决无限登录问题 centos7修改命令行提示符 PS1 补充、centos7没有滚动条 Linux系统的登录方式 以及 调用shell…

AWS简介

AWS AWS&#xff0c;全称为Amazon Web Services&#xff0c;是亚马逊公司旗下的云计算服务平台&#xff0c;自2006年起向全球用户提供广泛而深入的云计算服务。AWS是全球最全面、应用最广泛的云平台之一&#xff0c;它从全球的数据中心提供超过200项功能齐全的服务&#xff0c…

每周一算法:恰好经过K条边的最短路

题目描述 牛站 给定一张由 M M M 条边构成的无向图&#xff0c;点的编号为 1 ∼ 1000 1\sim 1000 1∼1000 之间的整数。 求从起点 S S S 到终点 E E E 恰好经过 K K K 条边&#xff08;可以重复经过&#xff09;的最短路。 注意: 数据保证一定有解。 输入格式 第 1 …

维护表空间中的数据文件

目录 向表空间中添加数据文件 从表空间中删除数据文件 删除users表空间中的users02.dbf数据文件 对数据文件的自动扩展设置 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 维护表空间中的数据文件主要包括向表空间中添…

C#【进阶】委托和事件

委托和事件 文章目录 1、委托1、委托概念2、基本语法3、定义自定义委托4、使用自定义委托5、委托变量可以存储多个函数6、系统定义好的委托思考 怪物死亡数据更新 2、事件1、事件概念2、事件的使用3、为什么有事件思考 热水器 3、匿名函数1、匿名函数概念2、基本语法3、使用4、…