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

  • word在哪里打开(word在哪里打开目录)

    word在哪里打开(word在哪里打开目录)

  • 为什么华为手机搜不到5gwifi(为什么华为手机突然黑屏然后按开机键都不显示)

    为什么华为手机搜不到5gwifi(为什么华为手机突然黑屏然后按开机键都不显示)

  • 华为p40与nova7参数对比(华为p40和nova7pro参数)

    华为p40与nova7参数对比(华为p40和nova7pro参数)

  • oppo底部菜单没了(oppo手机底部状态栏为什么没有)

    oppo底部菜单没了(oppo手机底部状态栏为什么没有)

  • 突然收到腾讯科技验证码短信(突然收到腾讯科技微信验证码怎么回事)

    突然收到腾讯科技验证码短信(突然收到腾讯科技微信验证码怎么回事)

  • 苹果xr手机屏幕调节灵敏怎么办(苹果xr手机屏幕不亮了但能听到声音怎么办)

    苹果xr手机屏幕调节灵敏怎么办(苹果xr手机屏幕不亮了但能听到声音怎么办)

  • 表格乘号怎么打(怎么输入乘号x)

    表格乘号怎么打(怎么输入乘号x)

  • 京东发货多发了谁承担(京东多发货会叫我退吗)

    京东发货多发了谁承担(京东多发货会叫我退吗)

  • 快手下载原图怎么去水印(快手怎样下载原图)

    快手下载原图怎么去水印(快手怎样下载原图)

  • 卸载wps文件会丢失吗(卸载wps文件会丢失文件吗)

    卸载wps文件会丢失吗(卸载wps文件会丢失文件吗)

  • 微信男女在哪里改(微信男女在哪里聊天)

    微信男女在哪里改(微信男女在哪里聊天)

  • 设置切换效果怎么设置(设置切换效果怎么取消)

    设置切换效果怎么设置(设置切换效果怎么取消)

  • 快手保证金可以不交吗(快手保证金可以开发票吗)

    快手保证金可以不交吗(快手保证金可以开发票吗)

  • a57支持快充吗(oppo a57t支持快充吗)

    a57支持快充吗(oppo a57t支持快充吗)

  • vivox20什么时间出的(vivox20多久发布的)

    vivox20什么时间出的(vivox20多久发布的)

  • 如何关闭手机hd功能(如何关闭手机hdr)

    如何关闭手机hd功能(如何关闭手机hdr)

  • 华为mate30闪存是ufs3.0吗(华为mate304g版闪存)

    华为mate30闪存是ufs3.0吗(华为mate304g版闪存)

  • rpa是什么技术(rpa是什么技术方案)

    rpa是什么技术(rpa是什么技术方案)

  • 手机淘宝红包怎么领取(手机淘宝 红包)

    手机淘宝红包怎么领取(手机淘宝 红包)

  • 怎么设置微信提示音(怎么设置微信提示音音量大小)

    怎么设置微信提示音(怎么设置微信提示音音量大小)

  • 浏览器私密空间怎么打开(浏览器私密空间在哪里打开)

    浏览器私密空间怎么打开(浏览器私密空间在哪里打开)

  • 未受信任软件删除怎么找到(未受信任软件删除后还会信任吗)

    未受信任软件删除怎么找到(未受信任软件删除后还会信任吗)

  • 蓝牙耳机有电流声怎么消除(蓝牙耳机有电流声怎么办)

    蓝牙耳机有电流声怎么消除(蓝牙耳机有电流声怎么办)

  • 怎么获取2021最新win10永久数字激活密钥 激活码分享 附激活工具(怎样获取)

    怎么获取2021最新win10永久数字激活密钥 激活码分享 附激活工具(怎样获取)

  • win10系统安装教程(win10系统安装详细步骤)

    win10系统安装教程(win10系统安装详细步骤)

  • Python tkinter 做一个VIP视频解析的桌面软件,100%你会爱上它(python tkinter ttk)

    Python tkinter 做一个VIP视频解析的桌面软件,100%你会爱上它(python tkinter ttk)

  • 外管证是在当地办理还是在外地办理
  • 固定资产折旧计算公式
  • 员工拓展活动方案范文
  • 一般纳税人转成小规模的条件
  • 劳务费确认收入
  • 委托在建工程会计分录
  • 企业零申报怎么申报
  • 以土地出资土地增值税
  • 质押费用计入什么科目
  • 银行收取代发工资合法吗
  • 退休人员返聘工资怎么缴税
  • 收到借款利息怎么做会计分录
  • 企业境外付款流程
  • 什么情况下需要写答
  • 给工会开发票企业需要报税吗?
  • 营改增的案例分析
  • 土地闲置费是否可以列入生产成本
  • 企业所得税年报更正申报
  • 个税返还手续费增值税申报填在哪里
  • 房地产开发企业什么意思
  • 走物流的货物如何收费
  • 企业成本费用包含
  • 冲减以前年度所得税费用
  • 残联备案还能补缴社保吗
  • 电子缴税付款凭证怎么做记账凭证
  • 旅游业小规模纳税人亏损怎么填报
  • 购进商品是什么会计科目
  • 华为正式发布鸿蒙官网
  • 即征即退申报表如何填写
  • php如何实现字符串反转
  • 不动产增值税总结
  • 酒店的押金怎么做账
  • 浅谈php的数据库管理系统
  • javaweb项目开发流程
  • 刚刚学完小车可以学摩托车吗
  • cpu spread spectrum
  • 原材料存货跌价准备会计分录
  • 油票抵税的顺序步骤是什么
  • 公益性怎么解释
  • js回调函数如何返回值
  • dedecms怎么改图片
  • syslog ng
  • 自查补税行为有哪些方面
  • 企业结售汇业务需要做什么
  • 分公司是独立的诉讼主体吗
  • 专票和普票都是13个点嘛
  • access导入到mysql
  • sql server2012使用方法
  • mysql文件更改存放路径
  • 以前年度多计管理费用怎么调整
  • 对公外汇汇款业务
  • 会计做账的原始凭证有哪些
  • 差旅费包括哪些项目
  • 收到税务局邮件
  • 年末利润如何计算
  • 工资及福利费科目
  • 辅导期一般纳税人标准
  • sqlserver函数大全
  • windowsserver2008密码规则
  • 文本文件模式
  • mac怎么访问windows
  • win8如何删除登录密码
  • 编程乱码
  • linux操作系统版本有哪些
  • VirtualBox安装64位系统报错的处理方法
  • saproxy.exe - saproxy是什么进程 有什么用
  • win7系统虚拟机
  • nodejs中art-template模板语法的引入及冲突解决方案
  • 一键清除照片上多余的人
  • 批处理文件.bat
  • unity屏幕截图
  • js显示时间并且之后秒数实时更新
  • 显示自己的ip的手机
  • css实现放大缩小的动画效果
  • jquery图片轮播代码
  • 城乡医保怎么看有没有钱
  • 电子税务局获取验证码异常
  • 广西税务登记查询网站
  • 公积金提取需要几个工作日
  • 贵州国家税务局陈开平
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设