返回顶部
首页 > 资讯 > 前端开发 > JavaScript >React组件在什么时候render
  • 862
分享到

React组件在什么时候render

2024-04-02 19:04:59 862人浏览 安东尼
摘要

这篇文章主要讲解了“React组件在什么时候render”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React组件在什么时候render”吧!对于如下De

这篇文章主要讲解了“React组件在什么时候render”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React组件在什么时候render”吧!

对于如下Demo,点击Parent组件的div,触发更新,Son组件会打印child render!么?

function Son() {   console.log('child render!');   return <div>Son</div>; }   function Parent(props) {   const [count, setCount] = React.useState(0);    return (     <div onClick={() => {setCount(count + 1)}}>       count:{count}       {props.children}     </div>   ); }   function App() {   return (     <Parent>       <Son/>     </Parent>   ); }  const rootEl = document.querySelector("#root"); ReactDOM.render(<App/>, rootEl);

在线Demo地址[1]

?右滑显示答案:                                                                                                                                                 不会

render需要满足的条件
React创建Fiber树时,每个组件对应的fiber都是通过如下两个逻辑之一创建的:

  • render。即调用render函数,根据返回的jsX创建新的fiber。

  • bailout。即满足一定条件时,React判断该组件在更新前后没有发生变化,则复用该组件在上一次更新的fiber作为本次更新的fiber。

可以看到,当命中bailout逻辑时,是不会调用render函数的。

所以,Son组件不会打印child render!是因为命中了bailout逻辑。

bailout需要满足的条件
什么情况下会进入bailout逻辑?当同时满足如下4个条件时:

1. oldProps === newProps ?
即本次更新的props(newProps)不等于上次更新的props(oldProps)。

注意这里是全等比较。

我们知道组件render会返回JSX,JSX是React.createElement的语法糖。

所以render的返回结果实际上是React.createElement的执行结果,即一个包含props属性的对象。

即使本次更新与上次更新props中每一项参数都没有变化,但是本次更新是React.createElement的执行结果,是一个全新的props引用,所以oldProps !== newProps。

如果我们使用了PureComponent或Memo,那么在判断是进入render还是bailout时,不会判断oldProps与newProps是否全等,而是会对props内每个属性进行浅比较。

2. context没有变化
即context的value没有变化。

3. workInProgress.type === current.type ?
更新前后fiber.type是否变化,比如div是否变为p。

4. !includesSomeLane(renderLanes, updateLanes) ?
当前fiber上是否存在更新,如果存在那么更新的优先级是否和本次整棵fiber树调度的优先级一致?

如果一致则进入render逻辑。

就我们的Demo来说,Parent是整棵树中唯一能触发更新的组件(通过调用setCount)。

所以Parent对应的fiber是唯一满足条件4的fiber。

Demo的详细执行逻辑
所以,Demo中Son进入bailout逻辑,一定是同时满足以上4个条件。我们一个个来看。

条件2,Demo中没有用到context,满足。

条件3,更新前后type都为Son对应的函数组件,满足。

条件4,Son本身无法触发更新,满足。

所以,重点是条件1。让我们详细来看下。

本次更新开始时,Fiber树存在如下2个fiber:

FiberRootnode       |   RootFiber

其中FiberRootNode是整个应用的根节点,RootFiber是调用ReactDOM.render创建的fiber。

首先,RootFiber会进入bailout的逻辑,所以返回的App fiber和更新前是一致的。

FiberRootNode       |   RootFiber             |   App fiber

由于App fiber是RootFiber走bailout逻辑返回的,所以对于App fiber,oldProps === newProps。并且bailout剩下3个条件也满足。

所以App fiber也会走bailout逻辑,返回Parent fiber。

FiberRootNode       |   RootFiber             |    App fiber       |  Parent fiber

由于更新是Parent fiber触发的,所以他不满足条件4,会走render的逻辑。

接下来是关键

如果render返回的Son是如下形式:

<Son/>

会编译为

React.createElement(Son, null)

执行后返回JSX。

由于props的引用改变,oldProps !== newProps。会走render逻辑。

但是在Demo中Son是如下形式:

{props.children}

其中,props.children是Son对应的JSX,而这里的props是App fiber走bailout逻辑后返回的。

所以Son对应的JSX与上次更新时一致,JSX中保存的props也就一致,满足条件1。

可以看到,Son满足bailout的所有条件,所以不会render。

感谢各位的阅读,以上就是“React组件在什么时候render”的内容了,经过本文的学习后,相信大家对React组件在什么时候render这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: React组件在什么时候render

本文链接: https://lsjlt.com/news/84429.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • React组件在什么时候render
    这篇文章主要讲解了“React组件在什么时候render”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“React组件在什么时候render”吧!对于如下De...
    99+
    2024-04-02
  • React组件什么时候render
    本篇内容主要讲解“React组件什么时候render”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React组件什么时候render”吧!对于如下Demo,点击...
    99+
    2024-04-02
  • React中的render什么时候执行过程
    这篇文章主要介绍了React中的render什么时候执行过程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们都知道Render在组件实例化...
    99+
    2024-04-02
  • React优化子组件render怎么用
    这篇文章主要为大家展示了“React优化子组件render怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“React优化子组件render怎么用”这篇文章吧...
    99+
    2024-04-02
  • react的setstate什么时候同步
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react的setstate什么时候同步?什么时候是异步的? 先给出答案: 有时表现出异步,有时表现出同步。setState只在合成事件和钩子函数中是“异...
    99+
    2023-05-14
    setstate React
  • react框架什么时候出来的
    本教程操作环境:Windows7系统、react18版、Dell G3电脑。一、React的起源和发展React是用于构建用户界面的JavaScript库, 起源于Facebook的内部项目,因为该公司对市场上所有 JavaScript M...
    99+
    2023-05-14
    React
  • React 高阶组件与Render Props优缺点详解
    目录高阶组件增强型高级组件注入型高阶组件高阶组件 VS Render Props总结高阶组件 高阶组件(HOC)是一个接受组件作为参数并返回一个新组件的函数,如果多个组件有相同的逻辑...
    99+
    2022-11-16
    React 高阶组件 Render Props Render Props
  • React中Render Props模式有什么用
    这篇文章主要介绍React中Render Props模式有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述Render Props模式是一种非常灵活复用性非常高的模式,它可以...
    99+
    2024-04-02
  • java类在什么时候加载
    类什么时候加载类的加载是通过类加载器(Classloader)完成的,它既可以是饿汉式[eagerly load](只要有其它类引用了它就加载)加载类,也可以是懒加载[lazy load](等到类初始化发生的时候才加载)。 ...
    99+
    2016-03-31
    java入门 java
  • win10什么时候上线 win10什么时候推出
    北京时间10月1日消息,微软公司今天在旧金山发布了自己的最新产品win10,直接跳过了win9,那么win10什么时候上线?win10什么时候出?一起来跟小编看一下吧。 现在还没有Windows 10系统发布的准确时间...
    99+
    2023-06-07
    win10
  • 在什么时候适合使用Map
    本篇内容介绍了“在什么时候适合使用Map”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!「Map」映射是一种...
    99+
    2024-04-02
  • Go在什么时候会抢占P
    本篇内容主要讲解“Go在什么时候会抢占P”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go在什么时候会抢占P”吧! 调度器的发展史在 Go 语言中,Goroutine 早期是没有设计成...
    99+
    2023-06-15
  • 使用react在修改state中的数组和对象数据的时候(setState)
    目录react修改state的数组和对象数据的时候(setState)需要注意react修改数组对象的注意事项删除数组中的指定元素合并两个对象修改多层级对象的值react修改stat...
    99+
    2024-04-02
  • react状态组件是什么
    这篇文章主要介绍了react状态组件是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 react状态组件有2...
    99+
    2024-04-02
  • PHP比较数组的时候发生了什么
    数组是PHP中一个非常重要的数据类型,它被广泛应用于各种场景中,比如存储数据、传递参数等等。在很多情况下,我们需要对两个或多个数组进行比较,以判断它们是否相等。那么,在PHP中,比较数组的时候发生了什么呢?PHP中有两种比较数组的运算符,分...
    99+
    2023-05-14
  • React的组件通讯是什么
    本篇文章为大家展示了React的组件通讯是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。组件通讯介绍内容组件是独立且封闭的单元,默认情况下,只能使用组件自己的数据。在组件化过程中,我们将一个完整...
    99+
    2023-06-25
  • Java匿名内部类在什么时候用
    Java匿名内部类通常在以下情况下使用:1. 当一个类只需要使用一次,并且这个类没有名字,可以使用匿名内部类来实现。这样可以避免创建...
    99+
    2023-08-15
    Java
  • java移位运算符在什么时候用
    Java移位运算符用于对一个数的二进制位进行移动。它们通常在以下情况下使用:1. 位运算:移位运算符可用于对整数进行位运算,如按位与...
    99+
    2023-08-29
    java
  • java什么时候用this
    this只存在于方法内部,用来代表调用改方法的对象。可以理解为每一个方法内部都有一个局部变量叫this,每当初始化一个对象时,就把该对象的地址传递给了该对象每一个方法中的this变量,从而可以在方法内部使用这个的对象。第一种情况 ...
    99+
    2017-01-02
    java入门 java
  • java什么时候出的
    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。 (推荐学习:java课程)Java语言作为静态...
    99+
    2020-09-18
    java入门 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作