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

  • 闲鱼订单怎么删除(闲鱼订单怎么删不掉)

    闲鱼订单怎么删除(闲鱼订单怎么删不掉)

  • 红米k40无字模式怎么设置(红米k40不用打和拼音)

    红米k40无字模式怎么设置(红米k40不用打和拼音)

  • 华为nova7如何设置拿起亮屏(华为nova7如何设置桌面时间)

    华为nova7如何设置拿起亮屏(华为nova7如何设置桌面时间)

  • 华为荣耀9x与p20对比(荣耀9x和p20哪个机型性能好些)

    华为荣耀9x与p20对比(荣耀9x和p20哪个机型性能好些)

  • iphone录像软件黑屏(苹果手机录像特别黑)

    iphone录像软件黑屏(苹果手机录像特别黑)

  • oppo原始密码六位(oppo手机原始密码是多少6位)

    oppo原始密码六位(oppo手机原始密码是多少6位)

  • 买家收到差评会知道吗(买家收到差评会怎么样)

    买家收到差评会知道吗(买家收到差评会怎么样)

  • 苹果的4G运存相当于安卓多少(iphone的4g运行内存)

    苹果的4G运存相当于安卓多少(iphone的4g运行内存)

  • 苹果6p频繁自动关机(苹果6p频繁自动开关机)

    苹果6p频繁自动关机(苹果6p频繁自动开关机)

  • 为什么往群里发不了红包(为什么往群里发文件发不出去)

    为什么往群里发不了红包(为什么往群里发文件发不出去)

  • ios13怎么退回以前版本(ios13怎么退回ios11)

    ios13怎么退回以前版本(ios13怎么退回ios11)

  • 文字替换怎么设置(文字替换怎么设置word)

    文字替换怎么设置(文字替换怎么设置word)

  • 为什么相机拍出来是反的(为什么相机拍出来的都那么丑)

    为什么相机拍出来是反的(为什么相机拍出来的都那么丑)

  • 苹果11新手机怎么激活(苹果11新手机怎么下载微信)

    苹果11新手机怎么激活(苹果11新手机怎么下载微信)

  • oppoa5怎么打开隐藏应用(oppoa5手机隐藏应用在哪里设置)

    oppoa5怎么打开隐藏应用(oppoa5手机隐藏应用在哪里设置)

  • 抬起亮屏什么意思(抬起亮屏的工作原理)

    抬起亮屏什么意思(抬起亮屏的工作原理)

  • 苹果13.1.2怎么更新下载的软件(苹果怎么更新13.3)

    苹果13.1.2怎么更新下载的软件(苹果怎么更新13.3)

  • 电脑耳机和外放一起响(电脑耳机和外放一起响win7)

    电脑耳机和外放一起响(电脑耳机和外放一起响win7)

  • 虎牙怎么投屏电视(虎牙投屏电视没声音怎么解决)

    虎牙怎么投屏电视(虎牙投屏电视没声音怎么解决)

  • 苹果x手机内存不够用了怎么办(苹果X手机内存多大)

    苹果x手机内存不够用了怎么办(苹果X手机内存多大)

  • 手机自助冻结怎么解除(手机自助冻结啥意思)

    手机自助冻结怎么解除(手机自助冻结啥意思)

  • 新闻发布及管理系统的设计与实现(论文+PPT+源码)(新闻发布管理系统)

    新闻发布及管理系统的设计与实现(论文+PPT+源码)(新闻发布管理系统)

  • 亲测有效,低调使用,这里有个白票ChatGPT的方法(低调低调)

    亲测有效,低调使用,这里有个白票ChatGPT的方法(低调低调)

  • 退个税app操作
  • 发票税率开错了3%开成5%怎么办
  • 劳务报酬怎么申报记账凭证
  • 活动经费属于什么费用
  • 小规模纳税人的增值税账务处理
  • 油费补贴是否计入个税
  • 通行费抵扣入账会计分录?
  • 项目收入怎么算
  • 怎么查公司账户是哪个银行的
  • 税款滞纳金怎么入账
  • 部队属于企事业单位吗
  • 非房地产企业转让旧房土地增值税
  • 房租收入如何结转成本
  • 风险控制措施包括哪5个方面
  • 进厂的政府补贴怎么拿
  • 公司贷款收入如何计算
  • 无线路由器1200m覆盖范围
  • 怎么操作win10系统
  • php 数字转中文
  • 收到退回多付款现金流量支付购买商品支付
  • win10如何禁止
  • 施工企业自建自用的工程
  • 确认坏账的会计处理
  • 企业备用金预借多久到账
  • 股票以公允价值计量
  • wifi万能钥匙密码王
  • 微信红包如何发出去
  • vue3.0路由配置
  • php教程从入门到精通
  • arptables命令详解
  • 新制度设置了应缴财政款科目原制度设置了什么科目
  • php static变量
  • 年底应交增值税销项税额要结平吗
  • 进项税额认证后可以撤销吗
  • 劳务费不足800如何入账
  • 送货单需要跟在凭证后面吗
  • php5.6漏洞
  • 织梦会员系统
  • 公司银行开户的经办人有无风险
  • 办税人员可绑定银行卡吗
  • 个税代扣代缴手续费返还需要缴纳增值税吗
  • SQL Server 2008 R2 超详细安装图文教程
  • 金税四期有什么变化
  • 所得税汇算清缴退税会计分录怎么做
  • 营业利润率高好还是低好
  • 企业设备融资是什么意思?
  • 工程款抵房款什么意思
  • 百旺开发票清单
  • 促销有哪几个方面
  • 代开专票是指?
  • 累计折旧的计提会计分录
  • MySQL关键字执行顺序
  • windows7安装后正常使用的安装方法
  • 打造安全稳定
  • win7系统如何创建管理员账户
  • win7系统怎么取消自动关机
  • ubuntu 无法正常启动
  • linux操作系统安装方法有哪几种
  • conf文件用什么软件打开
  • win8关闭系统更新
  • winxp资源管理器频繁无响应
  • linux 中断 处理
  • win7任务栏跑到右边了
  • win7 64位系统使用360安全浏览器在网页中播放视频出现花屏的解决方法
  • win8取消开始界面
  • sendmail邮件服务器在虚拟机的哪个位置
  • Win7系统可以装ie10浏览器么
  • Extjs grid panel自带滚动条失效的解决方法
  • jsonarray fromobject
  • node链接数据库
  • javascript 基础
  • javascript获取数据
  • 手机背光面板
  • 安卓手机管家下载
  • 置顶聊天折叠怎么开启
  • 微博评论系统
  • 建筑工程施工企业资质
  • 国税地税征管体制改革方案全文
  • 南通国资委网站首页
  • 新疆医保哪里查
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设