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

React PureComponent 和 React.memo()区别

1 注意

● PureComponent和memo仅作为性能优化的方式存在
● 不要依赖它来阻止渲染,会产生BUG
● PureComponnet 和memo 都是通过对 props 值的浅比较来决定该组件是否需要更新的。

2 PureComponent 和React.memo() 区别

PureComponent 和React.memo()都是React优化组件性能的方式。

  1. PureComponent是一个类组件,它通过比较当前和之前的props和state值来检查是否需要重新渲染。如果state 和 props 没有发生变化,则组件不会重新渲染。在PureComponent内部,它实现了一个shouldComponentUpdate方法,用于判断组件是否需要更新。这个方法默认会对组件的state和props进行浅比较,如果没有变化,那么就会返回false,阻止重新渲染。
  2. React.memo()是一个高阶函数,它接受一个组件并且返回一个新的组件,它通过浅比较当前和之前的props值来判断是否应该重新渲染组件。它提供第二个参数来自定义比较逻辑,可以用在深层次比较上。如果props没有变化,则组件不会重新渲染。

3 用法

3.1 PureComponent

import React from './react';
import ReactDOM from './react-dom';
class Counter extends React.PureComponent{
}
ReactDOM.render(<Counter />, document.getElementById('root'));

3.2 React.memo()

import React from 'react';
import ReactDOM from 'react-dom';
function SubCounter(props){return <div>{props.count}</div>
}
let MemoSubCounter = React.memo(SubCounter);
console.log(MemoSubCounter);
class Counter extends React.Component{state = {number:0}inputRef = React.createRef();handleClick = (event)=>{let amount = Number(this.inputRef.current.value);this.setState({number:this.state.number+amount});}render(){console.log('Counter render');return (<div><p>{this.state.number}</p><input ref={this.inputRef}/><button onClick={this.handleClick}>+</button><MemoSubCounter count={this.state.number}/></div>)}
}
ReactDOM.render(
<Counter />
, document.getElementById('root'));

打印的memo
在这里插入图片描述

相关文章:

  • 各平台,各语言基础数据类型占用字节比较
  • 数字人的未来:数字人对话系统 Linly-Talker + 克隆语音 GPT-SoVITS
  • Centos7下安装ruby2.7.8环境、WPScan的安装及使用介绍
  • 项目登录方案选型
  • 10分钟快速开始SkyWalking结合Springboot项目
  • 在两台CentOS 7服务器(IP地址分别为192.168.8.171和192.168.8.183)上部署MinIO集群。
  • nginx高级配置详解
  • Spring6学习技术|事务
  • 二. 系统性能评价(2分)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • 七大查找算法详解并附代码实现
  • Python爬虫-付费代理推荐和使用
  • 主从复制实现Redis集群
  • 远程连接 vscode 出错 “远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件”
  • Unity零基础到进阶 | Unity中的 RectTransformUtility 方法整理汇总
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • go语言学习初探(一)
  • HTML-表单
  • Java读取Properties文件的六种方法
  • Linux下的乱码问题
  • React as a UI Runtime(五、列表)
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • text-decoration与color属性
  • Webpack 4x 之路 ( 四 )
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 七牛云假注销小指南
  • 使用 QuickBI 搭建酷炫可视化分析
  • 详解移动APP与web APP的区别
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 智能网联汽车信息安全
  • # .NET Framework中使用命名管道进行进程间通信
  • #{}和${}的区别?
  • #162 (Div. 2)
  • #宝哥教你#查看jquery绑定的事件函数
  • (1)(1.13) SiK无线电高级配置(五)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (强烈推荐)移动端音视频从零到上手(上)
  • (四)模仿学习-完成后台管理页面查询
  • (转) Android中ViewStub组件使用
  • (转)IOS中获取各种文件的目录路径的方法
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .naturalWidth 和naturalHeight属性,
  • .net FrameWork简介,数组,枚举
  • .NET 表达式计算:Expression Evaluator
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .net生成的类,跨工程调用显示注释
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @RequestMapping 的作用是什么?
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]