位置: IT常识 - 正文

React--》React组件变化每次都会导致重新渲染,如何解决?(react组件库有哪些)

编辑:rootadmin
React--》React组件变化每次都会导致重新渲染,如何解决?

目录

React.memo

useCallback

useMemo


React.memo

推荐整理分享React--》React组件变化每次都会导致重新渲染,如何解决?(react组件库有哪些),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react 组件三种创建,react 组件三种创建,react组件框架,react组件必不可少的函数,react组件框架,react组件库有哪些,react组件constructor,react组件constructor,内容如对您有帮助,希望把文章链接给更多的朋友!

React组件会在两种情况下下发生渲染

第一种:当组件自身的state发生变化时

第二种:当组件的父组件重新渲染时

第一种情况下重新渲染无可厚非,state都变化了组件自然应该重新进行渲染,但是第二种情况似乎并不是总怎么必要,有时候仅仅只需要父组件重新渲染即可,但是其子组件也跟着渲染,如果是很复杂的逻辑的话,子组件再渲染一遍就会造成资源的浪费,有什么方法能杜绝这种情况呢?

React.memo()是一个高阶组件,它接收另一个组件作为参数,并且会返回一个包装过的新组件,包装过的新组件就会具有缓存作用,包装过后,只有组件的props发生变化时,才会触发组件的重新渲染,否则总是返回缓存中结果。

如下在父组件App中调用子组件A,在子组件A中调用孙组件B,在每个组件当中都打印标识组件渲染的证明,并且在后代组件中使用React.memo,防止组件的重新渲染,具体的实现过程如下图所示实现的过程。

接下来我会将组件渲染的过程一一记录下来,大家仔细看看加入了React.memo后,组件渲染会发生何种变化:

可以看到初次渲染时,所有的组件都会被执行一次,  当点击按钮时,父组件传递给子组件A的props值发生变化导致A组件又被重新渲染一次,接下来仅仅是父组件发生变化,当父组件的值为4的时候会再次导致子组件A的props值发生变化导致子组件A再次被重新渲染,因为孙组件B没有被传入props,导致其只有在初次渲染的时候被被渲染,后面即使父组件发生变化,其也不会重新渲染,具体的过程如上图所示。

useCallback

useCallback这个API作用也是阻止组件渲染的,不知道大家有没有设想过这样一个场景,当子组件调用父组件的方法去修改父组件身上的值的时候,子组件会不会重新被渲染,答案是会的。在知道这个原因的前提下,你应该要明白什么是重新渲染,重新渲染就是整个组件的代码会被重新执行一次,也就是说父组件修改其本身数值的方法也会被重新执行,这就导致了通过props传递给子组件其修改父组件的方法被重新执行变化了,导致子组件会被再一次被重新渲染,也就是说子组件的页面没有发生任何变化,但是子组件仍被重新渲染了,因此不管是用不用上面讲解的React.memo方法,子组件都会被重新渲染,具体效果如下:

React--》React组件变化每次都会导致重新渲染,如何解决?(react组件库有哪些)

有没有办法能够解决这个问题呢?这就要使用useCallback这个API来解决这个办法了。

useCallback是一个钩子函数,用来创建React中的回调函数,创建的回调函数不会总在组件重新渲染时重新创建,具体实现过程如下:

下图很明显,第一次创建时所有组件都会渲染一次,当修改父组件的值时,使用usecallback之后,其函数不会再被重新创建,这也就让其子组件不会再被重新渲染,完美解决问题。

useMemo

上面两个方法都是讲解组件与组件之间减少渲染的次数,那么组件自身能不能减少渲染的范围呢?要知道我们一旦对当前组件进行数值修改,当前组件就会被重新渲染,也就是说当前组件的所有代码都会被再次执行一次,但是再某种场景下,我仅仅是想修改当前组件某一处的数值,并没有想修改整个组件,但是整个组件都给我渲染一遍,这种是不是也会造成资源的浪费,给出如下情景:

import React, { useState } from 'react'const sumFun = (a,b) =>{ console.log('函数被重新执行了'); return a + b}const App = () => { const [count,setCount] = useState(0) const sum = sumFun(12,14) const addHandler = () =>{ setCount(prevState => prevState + 1) } return ( <div> <h2>当前函数的和为:{sum}</h2> <h3>App根组件--当前值为:{count}</h3> <button onClick={addHandler}>点击+1</button> </div> )}export default App

我仅仅是想增加当前组件的值,而函数是写死的,就是渲染一个数值而已,但是其被迫跟着整个组件重新渲染了,结果如下:

让我们设想这样一个场景:sumFun函数冤枉的说:我啥也没干你凭啥让我再重新执行一次,我: 让你执行就执行,废什么话,随大流懂不懂,sumFun怒气冲冲的说:这可是你说的,你不仁别怪我不义了,sumFun怀恨在心打出以下函数:

由于sumFun函数的骚操作,导致整个组件的运行被sumFun一人给阻塞掉了,必须等待sumFun执行完成,整个组件才会被重新渲染,一个人有问题了,整个组件都需要等待他,这就很被动了,于是我说:sumFun快收了神通吧,有没有啥办法能够解决它啊

接下来开始useMemo登场使用,给出如下代码:

import React, { useState,useMemo } from 'react'const sumFun = (a,b) =>{ const begin = Date.now() // 获取当前的时间戳 while(1){ if(Date.now() - begin > 3000){ // 死循环,必须让其等待三秒才break出去跳出循环 break } } console.log('函数被重新执行了'); return a + b}const App = () => { const [count,setCount] = useState(0) let a = 100 let b = 120 if(count % 10 === 0){ a+=count } const sum = useMemo(()=>{ return sumFun(a,b) },[a,b]) const addHandler = () =>{ setCount(prevState => prevState + 1) } return ( <div> <h2>当前函数的和为:{sum}</h2> <h3>App根组件--当前值为:{count}</h3> <button onClick={addHandler}>点击+1</button> </div> )}export default App

由于sumFun被useMemo包裹,这就导致其只有在a和b发生变化时才会被重新渲染,如下:

并不是以后的项目都需要限制重新渲染,代码逻辑简单组件功能少的完全是没必要的,影响极小,只要在特别情况下或者说项目复杂要追求效率的场景下,渲染限制组件重新渲染获取是一个不错的选择。

本文链接地址:https://www.jiuchutong.com/zhishi/295688.html 转载请保留说明!

上一篇:基于RuoYi框架自动生成后端代码及前端界面(ruoyi框架快速入门)

下一篇:vue3 + ts: layout布局(vue3+ts+vite)

  • css网页设计作业与模板网站相比,定制化网站仍然是当前网站市场的主流需求

    css网页设计作业与模板网站相比,定制化网站仍然是当前网站市场的主流需求

  • word文档字间距不一致怎么调(word文档字间距离)

    word文档字间距不一致怎么调(word文档字间距离)

  • vivoiQOO锁屏原子随身听怎么关闭(vivo手机怎么关闭原子桌面)

    vivoiQOO锁屏原子随身听怎么关闭(vivo手机怎么关闭原子桌面)

  • 中国银行怎么开通短信提醒(中国银行怎么开通电子账户)

    中国银行怎么开通短信提醒(中国银行怎么开通电子账户)

  • vivos6用的是什么处理器(vivos6好不好用)

    vivos6用的是什么处理器(vivos6好不好用)

  • 荔枝vip和爱奇艺vip可以通用吗(荔枝会员和奇异果会员哪个好)

    荔枝vip和爱奇艺vip可以通用吗(荔枝会员和奇异果会员哪个好)

  • 快手本地作品突然不见了的原因(快手里本地作品怎么没有了怎么找回)

    快手本地作品突然不见了的原因(快手里本地作品怎么没有了怎么找回)

  • 探探一天能配对多少人(探探一天只能匹配到一个人)

    探探一天能配对多少人(探探一天只能匹配到一个人)

  • qq一起听歌怎么关闭(qq一起听歌怎么加自己的歌)

    qq一起听歌怎么关闭(qq一起听歌怎么加自己的歌)

  • 微信聊天记录多久会自动消失(微信聊天记录多久可以撤回)

    微信聊天记录多久会自动消失(微信聊天记录多久可以撤回)

  • 微信发送成功后对方收不到(微信发送成功后变感叹号怎么回事)

    微信发送成功后对方收不到(微信发送成功后变感叹号怎么回事)

  • 华为下滑任务栏不见了(华为下滑任务栏怎么开启)

    华为下滑任务栏不见了(华为下滑任务栏怎么开启)

  • 手机突然不能开热点(手机突然不能开视频了是怎么回事?)

    手机突然不能开热点(手机突然不能开视频了是怎么回事?)

  • 电脑id是什么意思(电脑id地址是多少)

    电脑id是什么意思(电脑id地址是多少)

  • 明明备注了为什么卖家说没有(备注不明显)

    明明备注了为什么卖家说没有(备注不明显)

  • 华为mate20hd怎么关(华为mate20hdr怎么开)

    华为mate20hd怎么关(华为mate20hdr怎么开)

  • 苹果手机按键不灵怎么回事(苹果手机按键不灵敏怎么办)

    苹果手机按键不灵怎么回事(苹果手机按键不灵敏怎么办)

  • win10自带清理工具吗(w10自带的清理工具)

    win10自带清理工具吗(w10自带的清理工具)

  • 华为荣耀9x来电闪光灯怎么设置(华为荣耀9x来电铃声改了还是原声怎么办)

    华为荣耀9x来电闪光灯怎么设置(华为荣耀9x来电铃声改了还是原声怎么办)

  • 闲聊人脸验证在哪里设置(闲鱼人脸验证失败)

    闲聊人脸验证在哪里设置(闲鱼人脸验证失败)

  • vivo怎样把软件移到内存卡(vivo怎样把软件加入白名单)

    vivo怎样把软件移到内存卡(vivo怎样把软件加入白名单)

  • 电脑显示器改电视方法(电脑显示器改电视没有声音怎么办)

    电脑显示器改电视方法(电脑显示器改电视没有声音怎么办)

  • 华为nemtl00h是哪款机(nemal00华为是什么型号)

    华为nemtl00h是哪款机(nemal00华为是什么型号)

  • 上网题怎么转发邮件(上网题怎么拷贝)

    上网题怎么转发邮件(上网题怎么拷贝)

  • 快手怎么复制链接(快手怎么复制链接生成视频)

    快手怎么复制链接(快手怎么复制链接生成视频)

  • 抖音突然没有浏览量(抖音突然没有浏览量了怎么恢复)

    抖音突然没有浏览量(抖音突然没有浏览量了怎么恢复)

  • 如何预防计算机病毒?(如何预防计算机病毒的方法)

    如何预防计算机病毒?(如何预防计算机病毒的方法)

  • 系统安装步骤windows10(系统安装的步骤)

    系统安装步骤windows10(系统安装的步骤)

  • 双定户经营所得用申报吗
  • 所得税预缴怎么做分录
  • 免抵税额什么时候缴纳城建税
  • 财政补贴交不交印花税
  • 2019年新注册公司
  • 主营业务收入计入
  • 城市建设税和教育费附加计算公式
  • 限售股流通股
  • 上个月的进项发票可以这个月勾选吗
  • 购进二手办公设备如何进行入账?
  • 冲销无形资产如何会计分录?
  • 金税三期个人所得税税率
  • 不征税收入税收政策
  • 一般纳税人开普票多少个点
  • 健身房税率是多少
  • 三证合一后纳税人识别号和信用代码一样吗
  • 公司关门账上的盈余公积怎么处理?
  • 本年利润年末账务处理
  • 离婚后房产过户需要多少钱
  • vmware11安装win10
  • 怎样升级智慧中小学版本软件
  • 溢价购入债权投资是为啥
  • linux内核有什么作用
  • cpu资源占用高怎么办
  • 股权折价转让
  • puppetm
  • kaggle官网注册
  • 新用户注册表单代码
  • 会计的科类
  • 免税和免征增值税是一个意思么
  • 哪一个国家有大提顿国家公园
  • 公司收到投资款怎么写收据?
  • 滨州高新技术企业名单
  • opencv模板匹配原理
  • php判断用户是否登录
  • exfat转换fat32命令
  • 企业收到发票后怎么入账
  • 员工聚餐谁出钱
  • 增值税普通发票和电子普通发票的区别
  • 进项税额转出月底需要结转吗
  • 一个例子解释唯物辩证法三大规律
  • 未分配利润做账
  • php不支持mysql
  • 应付账款坏账损失的会计分录
  • 无锡政府回购安置房
  • 用友t3怎么结转本年利润
  • sql 按,拆分成多条数据
  • 初学access收获心得
  • 国债利息收入要征税吗
  • 一次性扣除固定资产出售处理
  • 暂估和开票的差异 erp处理
  • 贴现公司贴现合法吗
  • 固定资产折旧方法的选择
  • 某项租赁合同,租赁期为8年,每年年末支付租金100万
  • win8 win8.1
  • ubuntu怎么说
  • ubuntu系统自动获取ip
  • exeploer.exe
  • win7任务栏快捷启动如何设置
  • centos如何删除bond
  • 苹果预计10.1-15号到能准确吗
  • win10系统怎么设置默认打印机
  • 开发者学校
  • jquery prompt
  • 安卓游戏报告
  • 用简洁的语言推荐一本书
  • python让用户选择
  • 什么是自然数
  • me分析方法
  • javascript 代码
  • node搭建博客
  • Android屏幕适配分屏
  • javascript例题
  • 对于初学者的鼓励
  • 江西2022年选调
  • 构建税务系统纵向到底
  • 电子发票冲红期限
  • 咸阳高新区税务局地址
  • 收到unknown发来的短信
  • 河北社保网上申报时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设