你可能没有关注过的 React 性能优化

React性能优化问题,React生命周期函数shouldComponentUpdate、纯组件PureComponent详解(含实例) 目录 1_shouldComponentUpdate、纯组件PureComponent的作用 2_实例 1_shouldComponentUpdate、纯组件PureComponent的作用 shouldComponentUpdate、纯组件PureComponent都是用来做性能优化的,这两种方法可以避免子组件做无用的重复渲染,下面通过实例来演示这两种性能优化的方法。 2_实例 创建父组件悟空Wukong、子组件悟饭Wufan、子组件悟天Wutian。 在第一次render后,通过compon 阅读详情

this.handleClick = this.handleClick.bind(this);

}

handleClick() {

this.setState((state) => ({

count: state.count + 1,

}));

}

handleTestClick() {}

render() {

return (

{this.state.count}
click

);

}

}

这代码没什么好说的,每次点击click更新state,我现在问几个问题,你先思考一下~

  1. 每次点击click的时候,Test组件会打印Test componentDidUpdate吗?

  2. 如果我把Test组件的React.Component替换为React.PureComponent,结果与上面一样吗?如果不一样,为什么?

  3. 如果我修改这一行代码<Test onClick={this.handleTestClick} />为<Test onClick={() => {}} />结果又如何?

shouldComponentUpdate


好像所有的内容都要从这个东西说起,shouldComponentUpdate作为React生命周期的一部分,大多数React开发者至少还是听说过它的,简单来说在这个函数中返回一个布尔值,React会根据这个布尔值来判断组件是否需要重新渲染。

shouldComponentUpdate接收两个参数,一个是更新后的props,一个是更新后的state,可以通过比较两个props和state来决定是否需要重新渲染组件。

import React from ‘react’;

class Test extends React.Component {

componentDidUpdate() {

console.log(‘Test componentDidUpdate’);

}

// 每次点击 click 都会打印 Test componentDidUpdate

// 添加这个函数后当 count 没有变化时不会打印 Test componentDidUpdate

shouldComponentUpdate(nextProps) {

if (this.props.count === nextProps.count) {

return false;

}

return true;

}

render() {

return 

;

}

}

export default class App extends React.Component {

constructor(props) {

super(props);

this.state = { count: 0 };

this.handleClick = this.handleClick.bind(this);

}

handleClick() {

this.setState((state) => ({

count: state.count,

}));

}

render() {

return (

{this.state.count}
click

);

}

}

这段代码也算比较直观的说明了shouldComponentUpdate的用法,为什么要这么做?当只有一个Test组件的时候可能影响不大,那如果有一千个乃至一万个Test的时候呢,每点击一次click就有一千个、一万个Test的componentDidUpdate被调用,这就有点夸张了。所以当你在使用循环渲染组件的时候就一定要注意到这一个点,它可能会成为你应用的瓶颈。

现在我们来解一下第一个问题,每次点击click的时候,Test组件会打印Test componentDidUpdate吗?

是的,每次点击click的时候,Test组件会打印Test componentDidUpdate,除非我们在Test中定义了shouldComponentUpdate,同时返回了false阻止其重新渲染。

PureComponent


关于React的这个 API,相信大家也没有那么陌生,根据官方文档的说法Component和PureComponent很相似,两者的区别在于PureComponent中实现了shouldComponentUpdate函数,这也是为什么我说要从shouldComponentUpdate说起。

import React from ‘react’;

class Test extends React.PureComponent {

componentDidUpdate() {

console.log(‘Test componentDidUpdate’);

}

// 错误的用法

shouldComponentUpdate(nextProps) {

if (this.props.count === nextProps.count) {

return false;

}

return true;

}

render() {

return 

;

}

}

如果你在PureComponent中又使用了shouldComponentUpdate你应该会得到这样一个警告,侧面也告诉我们PureComponent已经实现了shouldComponentUpdate这个函数了。

Test has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.

官网文档中说PureComponent中以浅层对比props和state的方式来实现了这个函数,也就是浅比较,那什么又是浅比较呢?可以简单的理解为a === b,这里面还是有一些说头的,不过不在本文探讨范围内,举两个例子,大家可以自行搜索理解。

let a = 5;

let b = 5;

let c = {};

let d = {};

console.log(a === b); // true

console.log(c === d); // false

在来看一段因为不当的代码导致的问题,大家一定要注意这部分的内容。

import React from ‘react’;

class Test extends React.PureComponent {

// 根据从 App 中传来的 animal 渲染组件

// 在 App 中每次点击添加新的动物后, 这里还是原来的 dog

render() {

return 

Test: {this.props.animal.join(‘,’)}
;

}

}

export default class App extends React.Component {

constructor(props) {

super(props);

// 默认为一只狗

this.state = { animal: [‘dog’] };

this.handleClick = this.handleClick.bind(this);

}

// 每次点击把新的值添加进 animal 中

// 此处有一个 Bug, 由于 animal.push 方法虽然更新了原来的数组

// 但是他们还是一个数组(这个说法有些奇怪), 指针还是一样的

// 可能需要读者自行搜索理解 JS 中基本类型和引用类型的存储方式

// 所以当 Test 组件接收到新的 animal 时, 通过浅比较会发现它们其实是一样的

// 也就意味着 Test 不会重新渲染

handleClick(val) {

const { animal } = this.state;

animal.push(val)

this.setState({

animal,

});

}

// 根据 state 中的 animal 渲染组件

render() {

return (

App: {this.state.animal.join(',')}

);

}

}

看到这里相信你应该能解答第二个问题和第三个问题了,不过我们还是一起再来看看~

问:如果我把Test组件的React.Component替换为React.PureComponent,结果与上面一样吗?如果不一样,为什么?

答:因为每次传递props中的onClick都是App组件中的handleTestClick,同时使用了PureComponent,所以每次浅比较都是一致的,所以不会在打印Test componentDidUpdate了。

问:如果我修改这一行代码<Test onClick={this.handleTestClick} />为<Test onClick={() => {}} />结果又如何?

答:虽然使用了PureComponent,但是由于App每次调用render函数的时候都会重新声明一个方法,此方法和上一次传递给Test的方法不同,所以每次点击还是会打印Test componentDidUpdate。

剩点内容补充


除了上述两个 API 以外,其他 API 或多或少只是它们的改版,所以我就放在一起说了。

memo

React.memo在我看来就是PureComponent无状态组件版本,如果用的是class就用PureComponent,如果用的是无状态组件就用memo。

import React from ‘react’;

export default React.memo(function Test() {

return 

Test Component
;

});

// 它也可以接收第二个参数, 类似 shouldComponentUpdate

// 两个参数上次的props, 和当前的props

// 不传默认情况它们两个做浅比较, 传了由你自己控制

注意:此方法返回值与shouldComponentUpdate相反,返回值为true时不重新渲染组件。

useCallback 和 useMemo

这两个 API 是React Hook的一部分,为什么要放在一起说呢?因为它们非常的类似,据官方文档useCallback(fn, deps)相当于useMemo(() => fn, deps)。

因为React Hook,我现在基本很少写class组件了,原因是什么相信用过的小伙伴都清楚,本文不阐述这方面的内容,只想再问你一个问题:handleClick方法每次都会重新定义吗?

import React from ‘react’;

export default function Test() {

const handleClick = () => console.log(‘click’);

return 

Test

}

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦

ook的一部分,为什么要放在一起说呢?因为它们非常的类似,据官方文档useCallback(fn, deps)相当于useMemo(() => fn, deps)`。

因为React Hook,我现在基本很少写class组件了,原因是什么相信用过的小伙伴都清楚,本文不阐述这方面的内容,只想再问你一个问题:handleClick方法每次都会重新定义吗?

import React from ‘react’;

export default function Test() {

const handleClick = () => console.log(‘click’);

return 

Test

}

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦

[外链图片转存中…(img-GwOvorcg-1719240888409)]

ZYQN7000系列VxWorks驱动开发:VxWorks系统移植 文章目录ZYQN7000驱动开发:VxWorks系统移植1.硬件环境2.编译vsb和vip工程2.1修改设备树文件2.2添加调试打印组件3.选择uboot来启动VxWorks内核4.尝试在开发板上启动内核4.1 拷贝镜像和设备树至SD卡4.2开发板上电4.2.1 uboot成功启动4.2.2 启动VxWorks5.添加shell和cmd组件 ZYQN7000驱动开发:VxWorks系统移植 1.硬件环境 正点原子领航者开发板 2.编译vsb和vip工程 vsb和vip工程的编译过程可以参考之前的文章,htt 阅读详情

相关推荐

【Ultrascale+ MPSOC学习记录】6、从eMMC启动翻车

因为MPSOC还有一种启动模式是eMMC,接下来咱就实现从eMMC启动。

ryo891012的博客 474

React.Component 与 React.PureComponent(React之性能优化)

前言 先说说 shouldComponentUpdate 提起React.PureComponent,我们还要从一个生命周期函数 shouldComponentUpdate 说起,从函数名字我们就能看出来,这个函数是用来控制组件是否应该被更新的。 React.PureComponent 通过prop和state的浅对比来实现shouldComponentUpate()。 简单来说,这个生命周期...

weixin_30491641的博客 248

Linux与Windows双系统,安装完linux后无法通过grub进入Windows的解决方法

先装Windows 10,Windows可正常启动,再装Kali,Kali提示装grub后照装。然而装完后重启发现无Windows选项。

sakurashockwave的博客 6454

【React】shouldComponentUpdate与React.PureComponent

UI=render(data),你负责提供data,React负责render。 React的工作就是渲染,就是操作DOM,而且是很有智慧地操作DOM。 组件的state或props变化时,React会比对这次虚拟DOM和上次虚拟DOM,然后根据二者的不同,来操作真实DOM。 index.js import React from 'react'; import ReactDOM from 'react-dom'; import CountDown from "./countDown.js"; React

richest_qi的博客 491

从DIY到实战:手把手教你搭建一个媲美吉时利2450的nA级电流源表(附原理图与避坑指南)

本文详细解析如何从零打造nA级精密电流源,涵盖核心设计原理、PCB布局技巧、热电偶效应应对及校准验证体系。通过低成本替代方案和优化设计,实现媲美商用源表的性能,特别适合硬件爱好者和独立开发者。文章还提供原理图与避坑指南,助你轻松搭建高精度电流源系统。

weixin_42656416的博客 291

阅文集团大数据面试题及参考答案

在 Flink 中,watermark 是一种用于处理乱序事件时间的机制。实现接口:通常需要实现 AssignerWithPeriodicWatermarks 或 AssignerWithPunctuatedWatermarks 接口。前者会周期性地生成 watermark,后者则是基于某些特定事件来生成 watermark ,比如接收到某个特定值的消息时。定义位置:可以在数据源处或者在流处理的中间操作中定义 watermark。在数据源定义时,能更精准地根据数据的产生特性设置 watermark;

大模型大数据攻城狮的专栏 1088

前端进阶之路(三)React组件重新渲染之shouldComponentUpdate和React.PureComponent

state作为react的一个重要的部分,固然自动渲染给我们省了很多的麻烦,然而并不是我们想让他不渲染就很容易做到的 一些时候,state的重新渲染机制导致了不必要的渲染,所以研究一下用来一些特定的情况下也是很有必要的 一. shouldComponentUpdate (shouldComponentUpdate可能会导致bug,并不建议使用) 关于shouldComponentUpdate,R...

Root的博客 4707

10、使用Ray Serve实现微服务与模型部署

本文深入介绍了如何使用Ray Serve实现微服务与机器学习模型的高效部署。从基础的部署定义到复杂的模型服务场景,涵盖部署架构、HTTP与Python调用、资源配置、FastAPI集成、金丝雀发布策略及实际应用流程。文章还探讨了模型服务的关键需求如灵活性、批处理、硬件优化和可扩展性,并展示了Ray Serve如何满足这些要求。最后提供了常见问题解决方案与未来发展方向,帮助开发者构建高性能、易维护的模型服务平台。

blue42的博客 174

你可能没有关注过的 React 性能优化,0基础学Web前端

小编综合了阿里的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2401_84140442的博客 1183

基于MATLAB的语音声强度和响度分析及处理

综上所述,本文介绍了如何使用MATLAB进行语音信号的声强度和响度分析,并提供了相应的源代码。通过这些工具和方法,可以更好地理解和处理语音信号的声强度和响度特性,为语音信号处理和音频应用提供支持。声强度(Intensity)和响度(Loudness)是语音信号中常用的两个重要参数,用于描述声音的强度和感知响度。响度均衡化:可以通过对语音信号施加不同的加权滤波器,调整信号的频谱分布,从而改变声音的响度。除了分析语音信号的声强度和响度,MATLAB还提供了丰富的工具和函数,用于处理语音信号的声强度和响度。

COWizard的博客 617

codex出现Reconnecting和stream disconnected before completion:stream closed before response.complete解决方案

本文主要介绍了在使用codex过程中出现Reconnecting和stream disconnected before completion: stream closed before response.completed的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

你可能没有关注过的 React 性能优化,帮你突破瓶颈

先来看个代码,我直接在一个文件里定义多个组件方便大家观看,正式编写代码的时候一个文件就是一个组件。}));render() {return (click这代码没什么好说的,每次点击click更新state,我现在问几个问题,你先思考一下~每次点击click的时候,Test组件会打印吗?如果我把Test组件的替换为,结果与上面一样吗?如果不一样,为什么?如果我修改这一行代码为结果又如何?好像所有的内容都要从这个东西说起,作为React。

m0_60721649的博客 273

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 324

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

React 嵌套路由与布局

用嵌套 Route + Outlet 把后台布局只写一次,讲清 index、相对路径、404 与调试方法。

JudithHuang的博客 244

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

主从 Reactor 高并发服务器实战 (三):服务器套接字Socket模块详解与实现

本文实现了一个封装完善的Socket模块,将socket→bind→listen→accept等复杂操作收敛为简洁的类接口。通过RAII机制自动管理文件描述符生命周期,避免资源泄漏;提供CreateServer等便捷函数简化服务端创建流程,并支持非阻塞模式与属性设置。模块设计注重安全性与易用性,有效解决样板代码重复、错误处理分散等问题,为后续网络通信模块奠定坚实基础。

dasdasfv的博客 203

Agent 的 ReAct、Plan、Execute、Reflection 模式

本文系统解析 Agent 的 ReAct、Plan、Execute、Reflection 四模式,揭示其核心为“下一步谁定”与“错了怎么发现”两大问题。ReAct 逐步决策,适合动态环境但易冗余;Plan 一次性规划,高效却惧变化;Execute 严格落地,需明确判据与失败策略;Reflection 事后校验,强化纠错闭环。四者协同:外层规划,执行中嵌入思考,每步后反思,连续失败才重规划,构建稳定可控的智能体工作流。

2401_89855466的博客 324

React 错误边界 Error Boundary

用类组件 ErrorBoundary 隔离渲染错误,讲清能接住/接不住、重置策略与上报。

JudithHuang的博客 295

React 鉴权路由守卫直觉

用布局路由 + Navigate 做登录拦截和登录回跳,并说明前端守卫不是安全边界。

JudithHuang的博客 108

从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践

ShiyuAdmin 是一个基于 Go(Gin/GORM)与 React(Umi Max/Ant Design Pro)的开源通用管理后台,采用前后端分离架构,支持多数据库(PostgreSQL/MySQL/SQLite/SQL Server),通过 JWT 实现登录认证,结合 RBAC 模型实现菜单、按钮与接口权限控制,并引入数据权限机制(如部门隔离),保障操作安全。项目以清晰分层设计提升可维护性,支持 Docker Compose 一键部署,适用于快速搭建业务系统或学习后台开发实践。

JavaPub 355

我写了一个 Windows 开发环境管理平台:Nexus(Tauri 2 + Rust + React)

文件监听事件很密集。如果节流窗口内的变更直接丢弃,最后一次改动就永远加载不到——所以窗口结束时必须补一轮。只对「失败」重试,不对「启动中」重试。启动慢不代表启动失败,盲目重试只会把健康的服务越搞越糟。Nexus 原本是为了解决自己日常开发里「窗口太多、状态不清、日志找不到」的问题,后来慢慢补成了现在这个样子:项目与服务管理、日志、服务健康、文件与代码查看、文件监听、开机启动、Node 版本管理,以及一个内嵌的 AI 助手。如果你也在 Windows 上同时维护多个服务,欢迎试用。

hi星尘的博客 561

Linux网络学习【Reactor反应堆模式】

本文围绕 Linux 网络编程中的 Reactor 反应堆模式展开,以“事件驱动—组件协作—线程模型—代码实践”为主线,解析事件源、多路复用器、事件分发器与处理器的协作机制,梳理等待就绪、事件分发与回调执行流程,对比单 Reactor 单线程、单 Reactor 多线程及主从 Reactor 的组织方式。结合 epoll 与非阻塞读写,分析事件注册、连接接收、缓冲区管理、部分收发及资源清理,厘清就绪通知与操作完成的区别,讨论耗时任务对事件循环的影响,为构建结构清晰、便于扩展的并发网络服务器提供实践思路。

承于所学,探技术之渊;以代码求政,寻成长之道。 1万+

React Fragment与空标签的终极对比

在React类式组件中,<div>是渲染时必需的外层标签,但可通过Fragment或空标签<></>避免额外DOM节点。Fragment支持传入key,适用于列表遍历场景,而空标签不支持key,且仅允许key属性。两者均可减少冗余标签,提升性能与结构清晰度。

var_let_const的博客 184

React 表单:React Hook Form + Zod

用 React Hook Form + Zod 统一表单校验与类型,覆盖异步提交、跨字段校验和动态字段。

JudithHuang的博客 213

【C++后端开发项目】Reactor 模型 / C++ 仿写 muduo HTTP 服务器:让底层网络库真正跑起网页

本文是手写 C++ Web 服务器的应用层实战篇。在完成了底层的 Reactor 网络库后,本篇聚焦 HTTP 协议解析。详细拆解了如何利用状态机解决 TCP 半包/粘包难题,实现了基于 std::regex 的动态路由分发、防路径穿越的安全校验以及长短连接保活机制。带你打通从底层字节流到浏览器渲染的最后一公里。

jhj9201633的博客 289
上一篇: Web期末复习 —— JDBC 访问数据库
下一篇: 微信小程序网悦新闻开发--首页模块开发(三)
普通网友
博客等级 码龄5年 3419粉丝 477原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值