React--》React组件变化每次都会导致重新渲染,如何解决?

这篇具有很好参考价值的文章主要介绍了React--》React组件变化每次都会导致重新渲染,如何解决?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

React.memo

useCallback

useMemo


React.memo

React组件会在两种情况下下发生渲染

第一种:当组件自身的state发生变化时

第二种:当组件的父组件重新渲染时

第一种情况下重新渲染无可厚非,state都变化了组件自然应该重新进行渲染,但是第二种情况似乎并不是总怎么必要,有时候仅仅只需要父组件重新渲染即可,但是其子组件也跟着渲染,如果是很复杂的逻辑的话,子组件再渲染一遍就会造成资源的浪费,有什么方法能杜绝这种情况呢?

React.memo()是一个高阶组件,它接收另一个组件作为参数,并且会返回一个包装过的新组件,包装过的新组件就会具有缓存作用,包装过后,只有组件的props发生变化时,才会触发组件的重新渲染,否则总是返回缓存中结果。

如下在父组件App中调用子组件A,在子组件A中调用孙组件B,在每个组件当中都打印标识组件渲染的证明,并且在后代组件中使用React.memo,防止组件的重新渲染,具体的实现过程如下图所示实现的过程。

React--》React组件变化每次都会导致重新渲染,如何解决?

接下来我会将组件渲染的过程一一记录下来,大家仔细看看加入了React.memo后,组件渲染会发生何种变化:

React--》React组件变化每次都会导致重新渲染,如何解决?

可以看到初次渲染时,所有的组件都会被执行一次,  当点击按钮时,父组件传递给子组件A的props值发生变化导致A组件又被重新渲染一次,接下来仅仅是父组件发生变化,当父组件的值为4的时候会再次导致子组件A的props值发生变化导致子组件A再次被重新渲染,因为孙组件B没有被传入props,导致其只有在初次渲染的时候被被渲染,后面即使父组件发生变化,其也不会重新渲染,具体的过程如上图所示。

useCallback

useCallback这个API作用也是阻止组件渲染的,不知道大家有没有设想过这样一个场景,当子组件调用父组件的方法去修改父组件身上的值的时候,子组件会不会重新被渲染,答案是会的。在知道这个原因的前提下,你应该要明白什么是重新渲染,重新渲染就是整个组件的代码会被重新执行一次,也就是说父组件修改其本身数值的方法也会被重新执行,这就导致了通过props传递给子组件其修改父组件的方法被重新执行变化了,导致子组件会被再一次被重新渲染,也就是说子组件的页面没有发生任何变化,但是子组件仍被重新渲染了,因此不管是用不用上面讲解的React.memo方法,子组件都会被重新渲染,具体效果如下:

React--》React组件变化每次都会导致重新渲染,如何解决?

React--》React组件变化每次都会导致重新渲染,如何解决?

有没有办法能够解决这个问题呢?这就要使用useCallback这个API来解决这个办法了。

useCallback是一个钩子函数,用来创建React中的回调函数,创建的回调函数不会总在组件重新渲染时重新创建,具体实现过程如下:

React--》React组件变化每次都会导致重新渲染,如何解决?

下图很明显,第一次创建时所有组件都会渲染一次,当修改父组件的值时,使用usecallback之后,其函数不会再被重新创建,这也就让其子组件不会再被重新渲染,完美解决问题。

React--》React组件变化每次都会导致重新渲染,如何解决?

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

我仅仅是想增加当前组件的值,而函数是写死的,就是渲染一个数值而已,但是其被迫跟着整个组件重新渲染了,结果如下:

React--》React组件变化每次都会导致重新渲染,如何解决?

让我们设想这样一个场景:sumFun函数冤枉的说:我啥也没干你凭啥让我再重新执行一次,我: 让你执行就执行,废什么话,随大流懂不懂,sumFun怒气冲冲的说:这可是你说的,你不仁别怪我不义了,sumFun怀恨在心打出以下函数:

React--》React组件变化每次都会导致重新渲染,如何解决?

由于sumFun函数的骚操作,导致整个组件的运行被sumFun一人给阻塞掉了,必须等待sumFun执行完成,整个组件才会被重新渲染,一个人有问题了,整个组件都需要等待他,这就很被动了,于是我说:sumFun快收了神通吧,有没有啥办法能够解决它啊

React--》React组件变化每次都会导致重新渲染,如何解决?

接下来开始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发生变化时才会被重新渲染,如下:

React--》React组件变化每次都会导致重新渲染,如何解决?

并不是以后的项目都需要限制重新渲染,代码逻辑简单组件功能少的完全是没必要的,影响极小,只要在特别情况下或者说项目复杂要追求效率的场景下,渲染限制组件重新渲染获取是一个不错的选择。文章来源地址https://www.toymoban.com/news/detail-420521.html

到了这里,关于React--》React组件变化每次都会导致重新渲染,如何解决?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React中的组件的渲染函数(Render Function)是什么?什么是React中的函数组件和类组件?如何在React中进行状态管理?

    React中的组件可以有多种形式的渲染函数,包括传统的render()方法,以及近年来兴起的函数组件和Hooks中的useState()和useEffect()。在这篇文章中,我将详细介绍渲染函数,以及如何在React中使用它们。 渲染函数(Render Function)是指组件在生命周期中的一个特殊方法,它的作用是根据

    2024年02月13日
    浏览(33)
  • vue组件中重新渲染的3种方式

    这个是最推荐的。因为vue是通过虚拟Dom算法来判断元素的变化,是否变化的核心是通过判断新旧元素的key值是否变化。如果你的key是变化的,则重新渲染该元素,如果key没变,则不会重新渲染。 所以如果你想让你的组件重新渲染,你给组件加上 key 属性,然后在需要重新渲染

    2024年02月12日
    浏览(27)
  • ✝️ 强制 Vue 重新渲染组件的正确方法

    有时 Vue 的 reactivity 不符合需求,你需要重新渲染一个组件,或者可能只是想remove当前的 DOM 并 re-render。那么如何让 Vue 以 正确的方式重新加载组件呢? 强制 Vue 重新渲染组件的最佳方法是在组件上设置一个 :key 。当需要重新渲染组件时,只需更改键的值,Vue 就会重新渲染组

    2024年02月07日
    浏览(37)
  • uniapp转小程序 子组件中修改了父组件传过来的数据,子组件没有重新渲染

    昨天在开发中遇到了一个问题,在小程序中没有渲染,而在h5中是有渲染出来的。在小程序中,数据确确实实也是通过接口获取到了,也储存到了对应的字段里面。并且在子组件中监听了父组件传过来的数据,就是只渲染了一次,困惑了很久。对应的是最近使用的数据   因此

    2024年02月15日
    浏览(33)
  • react组件多次渲染问题

    问题背景 在数据没有发生变化的情况下React组件会进行数次重复渲染,绘制出来完全相同的两个图 排查思路 寻找子组件重渲染原因实验 测试一:在子组件的props未发生任何变更的情况下是否会发生重新渲染 测试结论:子组件即使不接收任何props当父组件重新渲染时子组件也

    2024年02月12日
    浏览(72)
  • React【React是什么?、创建项目 、React组件化、 JSX语法、条件渲染、列表渲染、事件处理】(一)

           React是什么? 为什么要学习React  React开发前准备  创建React项目 

    2024年02月11日
    浏览(43)
  • 【React】- 组件生命周期连续渲染两次问题

    最近在整理生命周期相关的知识内容,然后发现一个奇怪的现象,即组件的生命周期会运行2次!经过确认不是代码问题,于是开始找度娘,终于找到其原因-React中的严格模式,在这里记录一下 一、问题重现 如图所示,当组件初始化渲染时,每个周期都走了2次,按理说初始化

    2024年02月15日
    浏览(26)
  • 自定义鼠标指针图案每次开机或者重启都会重置的解决办法

    一款漂亮的鼠标指针常常能使我们身心愉快                                                                                       ...........................................................................................................................................................           

    2024年02月11日
    浏览(67)
  • Win10每次开机鼠标桌面右键都会显示撤销删除解决方法

    Win10每次开机鼠标桌面右键都会显示撤销删除解决方法分享。有用户电脑开机的时候,就会自动弹出撤销删除的窗口了。那么这个问题是怎么回事呢?接下来我们就一起来看看以下的详细操作方法教学吧。 情况一: 如果是联想,在联想管家把联想锁屏关了就行了。 情况二:

    2023年04月09日
    浏览(59)
  • Pycharm这个更新索引是个什么操作,为什么每次启动,都会进行?

    点击上方“ Python爬虫与数据挖掘 ”,进行关注 回复“ 书籍 ”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 九重城阙烟尘生,千乘万骑西南行。 大家好,我是皮皮。 一、前言 前几天在Python最强王者交流群【吴超建】问了一个 Pycharm 操作的问题,这里拿出来给大家分

    2024年02月01日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包