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

  • iqoo8pro怎么分屏(iqoo5pro怎么分屏)

    iqoo8pro怎么分屏(iqoo5pro怎么分屏)

  • ios13正式版什么出(ios13.0正式版什么时候出)

    ios13正式版什么出(ios13.0正式版什么时候出)

  • 抖音不登录不能搜索吗(抖音不登录不能搜索了)

    抖音不登录不能搜索吗(抖音不登录不能搜索了)

  • 4k是啥意思(4k是啥意思分辨率多少)

    4k是啥意思(4k是啥意思分辨率多少)

  • 荣耀20s怎么开空调(荣耀20手机控制空调怎么打开空调)

    荣耀20s怎么开空调(荣耀20手机控制空调怎么打开空调)

  • 华硕5v电压过高怎么修(华硕5v电压红)

    华硕5v电压过高怎么修(华硕5v电压红)

  • 对蓄电池充电什么能转化为什么能(蓄电池充电什么样算充满)

    对蓄电池充电什么能转化为什么能(蓄电池充电什么样算充满)

  • 计算机网络系统是一个什么系统(计算机网络系统按其覆盖范围可分成三类)

    计算机网络系统是一个什么系统(计算机网络系统按其覆盖范围可分成三类)

  • ipad可以当显示器吗(ipad2020可以当显示器)

    ipad可以当显示器吗(ipad2020可以当显示器)

  • 小米mix2s支持多少w快充(小米mix2s支持多大内存卡)

    小米mix2s支持多少w快充(小米mix2s支持多大内存卡)

  • 爱奇艺怎么qq登录(爱奇艺怎么qq登录不了)

    爱奇艺怎么qq登录(爱奇艺怎么qq登录不了)

  • 拼多多收到货怎么换货(拼多多收到货怎么删除订单)

    拼多多收到货怎么换货(拼多多收到货怎么删除订单)

  • 微信特别关心在哪里(微信特别关心在哪里设置)

    微信特别关心在哪里(微信特别关心在哪里设置)

  • set协议的特点(set协议的缺点)

    set协议的特点(set协议的缺点)

  • oppo手机怎样关机(oppo手机怎样关闭广告)

    oppo手机怎样关机(oppo手机怎样关闭广告)

  • 加密dns啥意思(加密的dns是指什么)

    加密dns啥意思(加密的dns是指什么)

  • 苹果怎么清理(苹果怎么清理听筒的灰尘)

    苹果怎么清理(苹果怎么清理听筒的灰尘)

  • 拼多多怎么关闭自动免拼(拼多多怎么关闭多多钱包)

    拼多多怎么关闭自动免拼(拼多多怎么关闭多多钱包)

  • 护理6s管理内容是什么(护理6S管理内容)

    护理6s管理内容是什么(护理6S管理内容)

  • 苹果手表蜂窝版需要插卡吗(苹果手表蜂窝版和gps款区别)

    苹果手表蜂窝版需要插卡吗(苹果手表蜂窝版和gps款区别)

  • oppo 新机reno2是5g手机吗(opporeno2z支持5g)

    oppo 新机reno2是5g手机吗(opporeno2z支持5g)

  • 8+256g什么意思(8+256的手机够用吗)

    8+256g什么意思(8+256的手机够用吗)

  • 优酷的截图在哪里找到(优酷视频截图保存在哪里)

    优酷的截图在哪里找到(优酷视频截图保存在哪里)

  • 华为jkmaloo型号是啥(华为jkmalooa是什么型号)

    华为jkmaloo型号是啥(华为jkmalooa是什么型号)

  • 转转怎么卖东西(转转怎么卖东西最快)

    转转怎么卖东西(转转怎么卖东西最快)

  • safari尚未接入互联网怎么设置(safari尚未接入互联网,自动关闭怎么回事)

    safari尚未接入互联网怎么设置(safari尚未接入互联网,自动关闭怎么回事)

  • 图虫视频怎么保存(图虫视频怎么删)

    图虫视频怎么保存(图虫视频怎么删)

  • 深度学习和日常代码中遇到的报错汇总及解决方案,持续更新中。。。。

    深度学习和日常代码中遇到的报错汇总及解决方案,持续更新中。。。。

  • 帝国cms怎么百度自动提交(帝国cms视频教程)

    帝国cms怎么百度自动提交(帝国cms视频教程)

  • 采购价格含税吗
  • 放弃退税理由是什么
  • 缴纳增值税影响损益吗
  • 什么是税务登记管理
  • 报销单据粘贴单图片
  • 补缴以前年度房产税以及滞纳金
  • 销货清单是否需盖章
  • 取得的进项发票当月不抵扣怎么做账
  • 小规模纳税人实收资本印花税如何交
  • 按季度报税怎么处理
  • 出口销售收入怎么算
  • 电子承兑汇票没开通能接受吗
  • 运输费计入采购成本的分录
  • 制造费用属于成本类还是损益类
  • 增值税 代销
  • 计提增值税附加税的会计科目
  • 补助及救济费用
  • 未抵扣的进项税在资产负债表里怎么填
  • 购销合同印花税按70%
  • 材料票可以直接在税务局开吗
  • 总额法和净额法哪个合理
  • 隔月的发票能作废吗
  • 增值税的征收范围包括在中华人民共和国境内
  • 如何利用流产让男人愧疚
  • 什么是要约的撤销
  • 销售产品出去 怎么做科目
  • mac废纸篓立即删除和清倒
  • linux shell语句
  • php的字符串函数
  • 对公网银数字证书
  • 龟背竹的养殖方法和管理
  • 常见的归中反应有哪些
  • 废品损失属于产品成本项目吗
  • 不构成业务的反义词
  • 14个Python处理Excel的常用操作,非常好用
  • unlinkhist.dat怎么删除
  • 如果企业一直亏损不交所得税会被税局稽查吗
  • 床垫可以开专票抵扣吗
  • 织梦内容页模板修改
  • 个税申报方式是什么意思
  • 会计政策变更追溯调整的年限
  • 小规模纳税人怎么申报增值税报表
  • 空白发票作废怎么处理
  • 固定资产折旧费用的账务处理
  • 工程项目需要交5000万保证金合理吗
  • 登记会计账簿的基本要求
  • 本年利润怎么结转成未分配利润
  • 非同一控制下控股合并入账价值
  • 存货跌价准备可以转回吗?
  • 残疾人残保金如何计算
  • 已抵扣的进项税额转出会计分录账务处理
  • 其他应收款在借方怎么调账
  • 未分配利润高怎么解释
  • 接受其他企业现金捐赠会计分录
  • 接受捐赠的固定资产计入什么科目
  • 基本户注销了还能查询流水吗
  • 收到不是股东的现金
  • 请问在哪里可以买到震楼器
  • mysql 分组语句
  • windows service 2008 r2
  • linux虚拟局域网搭建
  • nhaspx.exe是什么
  • centos named
  • softmangerlite.exe是什么进程 有什么用
  • 无法登录所请求的数据库 用户sa登录失败
  • 升级mac os
  • 如何解决焦虑的心理
  • javascript数据结构与算法 pdf
  • 日历插件vue
  • xml文件示例
  • php获取当前脚本路径
  • 安卓手机关掉
  • Unity UIScrollView优化
  • unity3d创建模型
  • node中的事件循环
  • android10获取设备id
  • python能爬取app吗
  • 老司机指的是
  • 北京电子税务
  • 德清社保局固定电话多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设