React.memo高阶组件

news/2024/11/28 19:39:02/

1、概念
React.memo 为高阶组件。 如果你的组件在相同 props 的情况下渲染相同的结果,那么你可以通过将其包装在 React.memo 中调用,以此通过记忆组件渲染结果的方式来提高组件的性能表现。这意味着在这种情况下,React 将跳过渲染组件的操作并直接复用最近一次渲染的结果。

类似于类组件中的PureComponent,都是浅层比较,只比较第一层的数据。

import React, { useState, useEffect, useContext } from 'react';// 如果num不改变当前组件不会重新渲染
const MyComponent =  React.memo((props) => {/* 使用 props 渲染 */return (<div>{props.num}</div>)
})
export default function hook() {const [num, setNum] = useState(1)return (<div><button onClick={() => setNum(num + 1)}>+1</button><MyComponent num={num}></MyComponent></div>)
}

2、特点
React.memo 仅检查 props 变更。如果函数组件被 React.memo 包裹,且其实现中拥有 useState,useReducer 或 useContext 的 Hook,当 state 或 context 发生变化时,它仍会重新渲染。

3、可接受第二个参数

默认情况下其只会对复杂对象做浅层对比,即只比较第一层的key,shallowEqual主要是通过Object.js来对比,因此对于对象或数组,则为false,因此每次都会进行渲染,如果你想要控制对比过程,那么请将自定义的比较函数通过第二个参数传入来实现,第二个参数是一个函数,返回true不渲染,false渲染

import React, { useState, useEffect, useContext } from 'react';const MyComponent =  React.memo((props) => {/* 使用 props 渲染 */return (<div>{props.num}</div>)/*** prevProps 上次的值* nextProps 最新的值* * 如果传来的值是偶数的话则不更新组件*/
}, (prevProps, nextProps) => {console.log(nextProps, nextProps.num % 2)return nextProps.num % 2 === 0
})export default function hook() {const [num, setNum] = useState(1)useEffect(() => {/*** 当它是一个空数组时,回调只会被触发一次,类似于 componentDidMount*/console.log("componentDidmount")}, [])return (<div><button onClick={() => setNum(num + 1)}>+1</button><MyComponent num={num}></MyComponent></div>)
}

http://www.ppmy.cn/news/978035.html

相关文章

SpringCloud-Alibaba之Sentinel熔断与限流

一、下载安装运行 http://localhost:8080进行访问 登录账号和密码均为sentinel 二、创建工程&#xff0c;并注册到nacos服务中心 依赖spring-cloud-starter-alibaba-nacos-discovery,spring-cloud-starter-alibaba-sentinel sentine-datasource-nacos (持久化)配置文件 se…

文件上传:原生input、组件ant-desgin-vue(通过某个按钮进行上传操作)

原生 <input type"file" ref"fileInput" accept".doc,.docx" change"handleUploadFile"/> <a-button><template #icon><UploadOutlined />选择文件 </a-button>const fileInputref<HTMLElement>…

AcWing241. 楼兰图腾(树状数组)

输入样例&#xff1a; 5 1 5 3 2 4输出样例&#xff1a; 3 4解析&#xff1a; 以某个点 i 为最低点的 V 的数量&#xff0c;为 i 左侧和右侧比 a[ i ] 大的数量 a&#xff0c;b 的乘积。 但是&#xff0c;直接求这两个数的复杂度为O(n)&#xff0c;则整个复杂度为O( n^2 )&am…

【GEE笔记】主成分分析(PCA)算法的实现和应用

前言 主成分分析&#xff08;PCA&#xff09;是一种常用的降维方法&#xff0c;它可以将多个相关的变量转换为少数几个不相关的变量&#xff0c;称为主成分&#xff08;PC&#xff09;。这些主成分可以反映原始变量的大部分信息&#xff0c;同时减少数据的复杂度和冗余性。在遥…

微服务笔记---Nacos集群搭建

微服务笔记---Nacos集群搭建 Nacos集群搭建1.集群结构图2.搭建集群2.1.初始化数据库2.2.下载nacos2.3.配置Nacos2.4.启动2.5.nginx反向代理2.6.优化 Nacos集群搭建 1.集群结构图 官方给出的Nacos集群图&#xff1a; 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理…

Redis追本溯源(三)内核:线程模型、网络IO模型、过期策略与淘汰机制、持久化

文章目录 一、Redis线程模型演化1.Redis4.0之前2.Redis4.0之后单线程、多线程对比3.redis 6.0之后 二、Redis的网络IO模型1.基于事件驱动的Reactor模型2.什么是事件驱动&#xff0c;事件驱动的Reactor模型和Java中的AIO有什么区别3.异步非阻塞底层实现原理 三、Redis过期策略1.…

【Gray Hat Python】构建自己的windows调试器

环境准备 windows10 64bit python3.7 64bit 打开可执行文件&#xff0c;创建进程 定义变量 以下代码用 ctypes 定义了调用 windows API 需要的结构 my_debugger_define.py import ctypesWORD ctypes.c_ushort DWORD ctypes.c_ulong LPBYTE ctypes.POINTER(ctypes.c_uby…

linux 系统编程

文件IO 从本章开始学习各种Linux系统函数,这些函数的用法必须结合Linux内核的工作原理来理解, 因为系统函数正是内核提供给应用程序的接口, 而要理解内核的工作原理,必须熟练掌握C语言, 因为内核也是用C语言写的, 我们在描述内核工作原理时必然要用“指针”、“结构体”、“链表…