位置: 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)

  • 苹果录屏功能在哪里设置(苹果录屏功能在哪设置出来手机)

    苹果录屏功能在哪里设置(苹果录屏功能在哪设置出来手机)

  • iphonex屏幕是2k吗(iphonex是不是2k屏幕)

    iphonex屏幕是2k吗(iphonex是不是2k屏幕)

  • 路由器不放在弱电箱怎么组网(路由器不放在弱电箱)

    路由器不放在弱电箱怎么组网(路由器不放在弱电箱)

  • qq亲密度90算高吗(qq亲密度93高吗)

    qq亲密度90算高吗(qq亲密度93高吗)

  • 0x00000007b蓝屏原因(0x0000007b蓝屏解决方案)

    0x00000007b蓝屏原因(0x0000007b蓝屏解决方案)

  • word文字上下间距(word文字上下居中怎么弄)

    word文字上下间距(word文字上下居中怎么弄)

  • 人像模式怎么虚化背景(人像模式怎么虚化调节)

    人像模式怎么虚化背景(人像模式怎么虚化调节)

  • 苹果7微信前置摄像头打不开(苹果7微信前置怎么打开)

    苹果7微信前置摄像头打不开(苹果7微信前置怎么打开)

  • wps文字无法保存或创建此文件(wps文字无法保存normal)

    wps文字无法保存或创建此文件(wps文字无法保存normal)

  • 苹果app恢复旧版本(苹果app恢复旧版本下载)

    苹果app恢复旧版本(苹果app恢复旧版本下载)

  • 开通vip怎么算一个月(请问开通vip怎么收费)

    开通vip怎么算一个月(请问开通vip怎么收费)

  • 苹果11跟苹果11pro的区别(苹果11跟苹果11pro屏幕一样吗)

    苹果11跟苹果11pro的区别(苹果11跟苹果11pro屏幕一样吗)

  • 荣耀手表2和华为gt2区别(荣耀手表2和华为gt2参数对比)

    荣耀手表2和华为gt2区别(荣耀手表2和华为gt2参数对比)

  • 麒麟最高多少处理器(麒麟数量)

    麒麟最高多少处理器(麒麟数量)

  • ppt映像右透视怎么设置

    ppt映像右透视怎么设置

  • oppo手机sos怎么设置(oppo手机sos设置)

    oppo手机sos怎么设置(oppo手机sos设置)

  • 嘀嗒出行咋解封(嘀嗒出行咋解封账号)

    嘀嗒出行咋解封(嘀嗒出行咋解封账号)

  • 如何解决微信自动退出(如何解决微信自动退出苹果手机)

    如何解决微信自动退出(如何解决微信自动退出苹果手机)

  • 小米手机收不到短信验证码怎么回事(小米手机收不到短信怎么恢复)

    小米手机收不到短信验证码怎么回事(小米手机收不到短信怎么恢复)

  • 支付宝怎么设置刷脸(支付宝怎么设置余额宝不自动转入)

    支付宝怎么设置刷脸(支付宝怎么设置余额宝不自动转入)

  • vivo手机怎么扫描文件(vivo手机怎么扫描)

    vivo手机怎么扫描文件(vivo手机怎么扫描)

  • 苹果MAC OS系统怎么设置分辨率调节字体大小(苹果的mac系统)

    苹果MAC OS系统怎么设置分辨率调节字体大小(苹果的mac系统)

  • 怎么解决Windows7系统开机密码过期?(怎么解决windows许可证即将过期)

    怎么解决Windows7系统开机密码过期?(怎么解决windows许可证即将过期)

  • 关于前端提示err_ssl_protocol_error错误的一次记录(前端常见错误)

    关于前端提示err_ssl_protocol_error错误的一次记录(前端常见错误)

  • 房屋租赁服务增值税税率是多少
  • 私车公用去税务局开什么发票
  • 什么是一般公共财政预算收入
  • 加计抵减税额账务处理
  • 外汇账户包括哪些类型
  • 什么费用可以报销工会经费
  • 坐收坐支在会计上如何反映
  • 参与工会职工应享受哪些福利待遇
  • 仓储部门折旧计入什么科目
  • 子公司员工向母公司申请党员
  • 发票开具丢失后如有罚款怎么处理?
  • 公司注销后银行账户怎么注销
  • 文化事业税收优惠政策
  • 税率税额是星号什么意思
  • 金蝶银行日记账取消勾对
  • 卖护肤品赚钱吗
  • 广告业的其他应收款包括哪些?
  • windows10如何重置密码
  • 待摊费用和预提费用的区别
  • 高新技术研发的会议有哪些
  • Win10 Build 19044.1320 (21H2)更新补丁KB5006738预览版发布(附更新修复内容汇总)
  • PHP:session_get_cookie_params()的用法_Session函数
  • PHP:stream_context_set_option()的用法_Stream函数
  • php数组函数,选班长
  • dgservice.exe是什么软件
  • wifi增强器1200m的是不是比较好
  • 酒店没有营业执照可以举报吗?
  • vue表单验证数字
  • 所得税 减半
  • 固定资产维修费计入固定资产吗
  • 金融企业呆账核销管理办法
  • 已计提完的固定资产怎么弄
  • JavaScript之Ajax-axios表单提交
  • nodejs如何与前端交互
  • 前端进阶教程
  • 自然人税收管理系统
  • python如何提取字典中的键
  • 免税农业企业所得税怎样填报
  • phpcms插件
  • php验证码代码怎么写
  • 企业开办期间费用需要开发票吗
  • 房产租赁增值税率是5%还是9%
  • 负数发票怎样做账
  • 1000元的打印机双十一满减可以减150吗少
  • 农产品收购发票使用范围
  • 加计抵减与加计抵消区别
  • 其他应付款贷方什么意思
  • 对方多开发票怎么处理?
  • 冲回以前年度暂估入库
  • 无奖有票是什么意思
  • 用友软件冲销之前凭证怎么操作
  • 个人贷款打到公司账户存在什么风险
  • 公益性捐赠要确认递延吗
  • 长期待摊费用处置
  • 主营业务收入为负数是什么意思
  • xtrabackup备份原理
  • vmware虚拟机步骤
  • 神舟hasee笔记本测评
  • bios设置密码怎么设置
  • ubuntu安装指南
  • win7系统怎么备份文件
  • linux卸载apache2
  • debian怎么配置ip
  • win10预览版怎么升级到正式版
  • animate javascript
  • python自动生成
  • php常用函数200个
  • jquery可以实现哪些效果
  • unity星球模型
  • unity3d功能
  • javascript 代码
  • 安卓源代码开放吗
  • bootstrap基础教程
  • 全电子发票开具怎么扫脸认证?
  • 小微企业契税政策
  • 核定征收的适用税率
  • 地税的发票是什么样
  • 内蒙古国家税务总局电子税务局官网
  • 2021年江苏省考常州职位表
  • 税收优惠政策有哪些企业
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设