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

  • 作为活动运营,你必须知道的营销引爆方法(活动运营的工作任务)

    作为活动运营,你必须知道的营销引爆方法(活动运营的工作任务)

  • vivo NEX 3s一共有多少个摄像头(vivo nex3 3s)

    vivo NEX 3s一共有多少个摄像头(vivo nex3 3s)

  • mibox3s是什么设备(mibox4)

    mibox3s是什么设备(mibox4)

  • 苹果手机可以开空调么(苹果手机可以开空调吗怎么开)

    苹果手机可以开空调么(苹果手机可以开空调吗怎么开)

  • 荣耀30pro防水防尘吗(荣耀30pro 防水)

    荣耀30pro防水防尘吗(荣耀30pro 防水)

  • 腾讯大王卡激活要钱吗(腾讯大王卡激活了可以不用吗)

    腾讯大王卡激活要钱吗(腾讯大王卡激活了可以不用吗)

  • 华为手机色彩校正要不要开启(华为手机色彩校正模式怎么关闭)

    华为手机色彩校正要不要开启(华为手机色彩校正模式怎么关闭)

  • 网易云上传新歌审核要多久(网易云 上传歌曲)

    网易云上传新歌审核要多久(网易云 上传歌曲)

  • b365支持内存频率(b365支持内存频率最大多少)

    b365支持内存频率(b365支持内存频率最大多少)

  • 低速sd卡什么意思(低速sd卡怎么读取)

    低速sd卡什么意思(低速sd卡怎么读取)

  • plus表示什么(plus是什意思)

    plus表示什么(plus是什意思)

  • 抖音没声音(airpods刷抖音没声音)

    抖音没声音(airpods刷抖音没声音)

  • wps表格拆分单元格(wps表格拆分单元格一分三)

    wps表格拆分单元格(wps表格拆分单元格一分三)

  • 快手显示请检查网络是否正常(快手显示请检查网络是否正常是不是过段时间就没有了)

    快手显示请检查网络是否正常(快手显示请检查网络是否正常是不是过段时间就没有了)

  • ios是什么字体(ios使用的是什么字体)

    ios是什么字体(ios使用的是什么字体)

  • word2000是应用软件吗(word2003是应用软件)

    word2000是应用软件吗(word2003是应用软件)

  • 找不到指定的模块是什么意思(找不到指定的模块是什么情况)

    找不到指定的模块是什么意思(找不到指定的模块是什么情况)

  • 小米手环4恢复出厂设置后怎么绑定(小米手环4恢复出厂设置后连接不上)

    小米手环4恢复出厂设置后怎么绑定(小米手环4恢复出厂设置后连接不上)

  • 淘宝好评率怎么看(淘宝的好评率是怎么评的)

    淘宝好评率怎么看(淘宝的好评率是怎么评的)

  • 手机本身内存小怎么办(手机内存很小)

    手机本身内存小怎么办(手机内存很小)

  • 快手直播伴侣看不到字幕(快手直播伴侣看不到互动消息)

    快手直播伴侣看不到字幕(快手直播伴侣看不到互动消息)

  • 淘宝被降权了怎么恢复(淘宝被降权了怎么查)

    淘宝被降权了怎么恢复(淘宝被降权了怎么查)

  • 红魔手机哪个公司的(红魔手机哪个公司生产的)

    红魔手机哪个公司的(红魔手机哪个公司生产的)

  • 闪迪u盘太烫会烧坏吗(闪迪u盘温度高)

    闪迪u盘太烫会烧坏吗(闪迪u盘温度高)

  • 7.0.4微信怎么改铃声(微信8.0.7怎么改微信号)

    7.0.4微信怎么改铃声(微信8.0.7怎么改微信号)

  • 重置IE浏览器(重置ie浏览器会有什么影响)

    重置IE浏览器(重置ie浏览器会有什么影响)

  • 原 !神静态网页布局详解,html+css布局实战,附详细代码

    原 !神静态网页布局详解,html+css布局实战,附详细代码

  • 【JSP课程设计】个人信息管理系统(代码保姆级)(jsp课程设计含源代码)

    【JSP课程设计】个人信息管理系统(代码保姆级)(jsp课程设计含源代码)

  • ChatGPT 指令大全(ctu指令)

    ChatGPT 指令大全(ctu指令)

  • 投资者投入固定资产的合同或协议约定
  • 工商年报的纳税总额是什么
  • 收入准则范围内
  • 增值税抵扣了,附加税怎么算
  • 所得税季报季末人数怎么计算
  • 股权投资公司属于金融企业吗
  • 固定资产原值包含进项税吗
  • 个人销售自产农产品 个人所得税
  • 小微企业增值税减免账务处理
  • 开票资料都包括什么内容
  • 长期借款费用会减少吗
  • 企业合并的被合并方会计分录
  • 有形动产租赁服务
  • 车辆抵押登记费用可以退回吗
  • 建筑公司外包工程收入怎么记账
  • 企业如何进行利润分配的会记处理
  • 票据行为为什么没有付款
  • 三证合一后新办企业多久去税务登记
  • 营改增成功案例
  • 事业单位属于一级单位吗
  • 物业公司开停车位费全电发票
  • 社保和个税怎么个对应法
  • 税号最后一位字母T
  • 建筑装饰行业税负
  • 什么是往来科目
  • 补缴的增值税可以计入以前年度损益调整
  • 租赁设备发票备注栏怎么填写
  • 长期待摊费用发生当月摊还是次月摊
  • 不得抵扣的进项税额计入哪里
  • w10纯净版系统怎么样
  • php快递查询系统
  • 如何更改文件的创建时间
  • 拍卖公司收入计入什么分录
  • wordpress怎么搜索域名
  • 存货跌价准备是什么意思
  • echarts-wordcloud 血泪总结使用说明 (配置项及其不足点优化)
  • 直接材料费用包括
  • 没有抵扣联可以作废吗
  • 企业应该从哪些方面把握消费者行为的关键点
  • 聊聊vue3的defineProps、defineEmits、defineExpose
  • 小微企业的增值税税收优惠政策
  • discuz怎么添加diy模块
  • 进口货物交哪些税费
  • 网上学电脑
  • c语言中局部变量和全局变量同名
  • 小规模纳税人是个体户吗
  • 企业向个人借款协议范本
  • 折旧汇总分配周期参数设定完成可以更改吗
  • 劳务报酬所得项目
  • 个税代扣代缴需要什么
  • 递延所得税资产和所得税费用的关系
  • 食堂费用没有发票
  • 认缴的出资额
  • 收到社保的退费是怎么回事
  • 免税饲料做为免税吗
  • 销售收入打折后怎么做账
  • 代理服务费计入什么科目
  • 广告赞助的形式
  • 企业申请支付宝账号步骤
  • sql语句大全实例教程
  • sqlserver响应好慢
  • unix系统中目录采用什么结构
  • 电脑安装win8系统
  • wp程序
  • mac怎么移动鼠标
  • apache 443
  • hyper-v以后安装操作系统
  • win10系统安装.net framework 3.5
  • win10系统应用更新
  • scumpve服务器
  • css选择器 菜鸟教程
  • js处理跨域方式及原理
  • nodejs实战
  • unity unity3d
  • highcharts update
  • jquery fullpage
  • Android android.support.v4.widget.SlidingPaneLayout 侧滑示例
  • 济宁市税务局官网名称
  • 残疾人有车能否坐公交车
  • 云南省2021年退休金计发基数
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设