首页 > 其他分享 >React性能之--如何避免组件重复渲染?

React性能之--如何避免组件重复渲染?

时间:2024-08-09 18:24:59浏览次数:16  
标签:渲染 -- memo React Context 组件 PureComponent

         在react中,我们会发现存在组件重复渲染,虽然说如果项目不大的话,这点影响不大,但是我们还是尽量避免组件渲染比较好,养成好习惯,尽可能让不管是大小项目,都让性能尽可能优化 。那我们如何避免组件重复渲染呢?

   一、在 React 中,可以通过以下几种方法来避免组件重复渲染:

      1、PureComponent 或 React.memo:这些是 React 提供的优化组件渲染的高阶组件。                  (1)PureComponent:会自动实现了shouldComponentUpdate方法,进行浅比较来判断是否需要重新渲染组件,PureComponent 在 shouldComponentUpdate 方法中对组件的 propsstate 进行浅比较。在React 16.8之前,建议使用PureComponent来优化组件性能。

          (2)React.memo:在React 16.8之后,引入了React.memo。React.memo是一个高阶组件,用于包装函数组件。它与PureComponent类似,也会进行浅比较来判断是否需要重新渲染组件,它对函数组件进行浅比较。如果 props 或 state 没有变化,组件将不会重新渲染。

      注意:React 16.8开始,推荐使用React.memo优化函数组件性能,而不再需要使用PureComponent

     2、 shouldComponentUpdate:在类组件中,可以手动实现 shouldComponentUpdate 方法来判断组件是否需要重新渲染。在该方法中,可以比较前后的 props 和 state,如果它们没有变化,可以返回 false 阻止组件重新渲染。

     3、 React 的 Context API:Context 可以避免跨层级组件不必要渲染。通过在上层组件中使用 Context.Provider,可以将需要共享的数据传递给子组件。子组件可以通过 Context.Consumer useContext Hook获取这些数据,而不需要通过 props 传递。

      总的来说,避免组件重复渲染关键减少不必要渲染触发。可以通过使用PureComponent 或 React.memo 来自动检测变化,并且在需要的地方手动实现 shouldComponentUpdate 方法或使
用 Context 来控制渲染。

二、使用

    1、PureComponent 或 React.memo

 2、 shouldComponentUpdate:

例子:在这个例子中,如果nameage没有改变,那么组件的render方法将不会被调用。这对于避免不必要的渲染可以提高性能

 3、 React 的 Context API

假设我们有一个简单的计数器组件,它包含一个按钮,点击按钮会增加计数器的值。现在我们希望将计数器的值传递给组件树中的其他组件,而不需要通过props将值逐级传递。

使用React的Context API可以实现这个目的。

(1)我们创建一个Context对象

(2)计数器组件:然后,在计数器组件中,我们将CounterContext.Provider包装在按钮周围,并将计数器的值作为value传递给Provider

(3)使用CounterContext.Consumer:现在,我们可以在任何想要访问计数器值的组件中使用CounterContext.Consumer

这样,每当我们点击增加计数器按钮时,只有DisplayCount组件会重新渲染,而不是整个组件树。这是通过Context API提供的跨组件传递数据的机制,它可以避免重复渲染整个组件树。

标签:渲染,--,memo,React,Context,组件,PureComponent
From: https://blog.csdn.net/2401_85955297/article/details/141003489

相关文章

  • 【数据结构】关于栈你必须知道的内部原理!!!
    前言:......
  • HTTP协议基础知识【后端 4】
    HTTP协议基础知识HTTP(HyperTextTransferProtocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,它定义了客户端(如浏览器)与服务器之间数据传输的格式和规则。无论是浏览网页、在线购物还是使用各种Web应用,HTTP都扮演着至关重要的角色。本文将深入解析HTTP协议的基......
  • (day31)leecode热题——多数元素
    描述给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2提示:n==......
  • 基于STM32设计的智能家居系统(采用OneNet云平台)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)基于STM32设计的智能家居系统(采用OneNet云平台)1.介绍基于STM32微控制器和......
  • 大数据信用报告查询哪家平台的比较好?
    相信在搜索大数据信用的你,已经因为大数据信用不好受到了挫折,想详细了解一下自己的大数据信用,但是找遍了网络上的平台之后才发现,很多平台都只提供查询服务,想要找一个专业的平台查询和讲解很困难。下面本文就为大家介绍一下大数据信用查询平台哪家比较好,希望对你选择大数据信......
  • 回归预测|一种多输入多输出的粒子群优化支持向量机数据回归预测Matlab程序PSO-MSVR非f
    回归预测|一种多输入多输出的粒子群优化支持向量机数据回归预测Matlab程序PSO-MSVR非for循环实现原理上进行修改多输出文章目录前言回归预测|一种多输入多输出的粒子群优化支持向量机数据回归预测Matlab程序PSO-MSVR非for循环实现原理上进行修改多输出一、PSO-MSVR......
  • sky-take-out chapter 1
    开发环境搭建一、前端环境搭建二、后端环境搭建2.1项目结构(1)sky-take-out:maven父工程,统一管理依赖版本,聚合其他掌控子模块(2)sky-common:子模块,存放公共类,例如:工具类、常量类、异常类等constant常量类context与项目上下文有关enumeration枚举类exception异常类......
  • 三个数字的加减乘除模运算
    Console.WriteLine("请输入第一个数字:");doubled1=double.Parse(Console.ReadLine());Console.WriteLine("请输入第二个数字:");doubled2=double.Parse(Console.ReadLine());Console.WriteLine(&......
  • 在Modbus协议中,传输一个float类型的数值
    假设你想传输的浮点数是123.456,其在内存中的二进制表示为CDABEF12(这是假设为大端序的情况,即最高有效字节先出现)。为了将其发送给Modbus设备,你需要将这32位拆分为两个16位的寄存器值CDAB和EF12。#include<stdint.h>voidfloat_to_modbus_regs(floatf,uint16_t*reg_high......
  • mqtt订阅和发布
    importpaho.mqtt.clientasmqttimporttimeMQTTHOST="192.168.0.4"MQTTPORT=1883mqttClient=mqtt.Client()#连接MQTT服务器defon_mqtt_connect():mqttClient.connect(MQTTHOST,MQTTPORT,60)mqttClient.loop_start()#publish消息defon_publish(t......