React18学习笔记 第六篇:对React内部运作深入了解

Part1 组件之间的概念差异

·组件

组件是我们为了描述用户界面的一部分而编写的,它只是一个普通的JavaScript函数,但它是一个返回React式元素的函数,这些元素是用JSX语法来编写的,我们可以把组件理解为一个“蓝图”或“模板”。

·组件实例

一个组件实例就像是一个组件的实际物理表现,通俗来讲,React在哪里调用了组件,哪里就有组件实例。事实上,每个实例都有自己的状态和道具,也有自己的生命周期,就像一个活的有机体。

·React元素

当React在每个实例中执行代码,它们中的每一个都将返回一个或多个React元素。React元素基本上包含为当前组件实例创建DOM元素所需的所有信息,因此,React元素最终将会被转换为实际的DOM元素,然后被浏览器刷新到页面上。

 


Part2 组件在屏幕上显示的流程

·触发阶段

通过更新状态触发新的渲染,有两种情况,第一种是程序第一次运行(初始渲染),第二种是发生在一个或多个组件实例中的状态更新(重新渲染)

·渲染阶段

React调用我们的组件函数,并找出它应该如何更新DOM

·提交阶段

新元素可能或被放置在DOM中,已经存在的元素可能会被更新或删除,为了正确反映应用程序的当前状态

·刷新屏幕

浏览器注意到DOM已经更新,便刷新屏幕,这一步才实际上发生了视觉上的变化

 


Part3 key prop

key是一个特殊的道具,我们可以用它来告诉不同的算法某个元素是独一无二的,这对DOM元素和React元素都是有效的。在实践中,这意味着我们可以给每个组件实例一个唯一的标识,这将允许React区分同一组件类型的多个实例。

key通常会被用在列表中或者被用于重置状态

·key用于列表中

用法例子如下:

<ul>

     <Question key='q1' question={q[1]}/>

     <Question key='q2' question={q[2]}/>

</ul>

·key用于重置状态

例如:

<ContentBox>

     <Content

          content={{

               title:'title1'

               body:'body2'

          }}

          key="c23" //此处的key值为c23,使得React唯一标识此组件实例

     />

</ContentBox>

当我们想要一个新的content,可以给它一个不同的key,就会创造出一个全新的DOM元素,这样一来状态可以重置了,例如:

<ContentBox>

     <Content

          content={{

               title:'title1'

               body:'body2'

          }}

          key="c89" //此处的key值为c89,使得React唯一标识此组件实例

     />

</ContentBox>

 


Part4 关于渲染逻辑的规则

在React组件中,我们可以写入两种类型的逻辑,分别是渲染逻辑和事件处理函数。渲染逻辑基本上是位于组件顶层的所有代码,用于描述某个组件实例的视图应该是什么样子的。事件处理函数基本上就是执行的代码片段,作为处理程序正在监听的事件的结果。

渲染逻辑不允许产生任何副作用,换句话说,运行在顶层的逻辑并且负责渲染的组件应该与外界没有交互。这意味着渲染逻辑不允许执行网络请求、不允许创建计时器或者直接使用DOM API(比如使用添加事件监听器监听事件)

 


Part5 批处理状态更新

React在更新同一事件处理程序函数中的多个状态片段时,会把所有的状态批处理到一个状态上来更新整个事件处理程序,比如说:

const reset=function(){

     setAnswer(' ')

     console.log(answer)

     setBest(true)

     setSolved(false)

}

//在这个例子中有三个状态发生了更新,而React不会分别进行三次渲染,而是把这三个状态批处理,一起渲染

//组件状态在渲染阶段是存储在纤维树(fiber tree)中的,在上述代码中,在打印answer的地方时,渲染阶段尚未发生,所以React仍然在逐行读取函数,弄清楚哪些状态需要更新,因此,控制台打印answer的结果将会是answer原来的值。

状态更新只会在重新渲染后反映在状态变量中,出于这个原因,我们说React中的更新状态是异步的。

 


Part6 关于事件传播和事件委托的工作原理

假设现在有一个DOM树:

<html>

<body>

<div>

<header>

<div>

<button><button><button>

当我们点击button,事件触发,将会创建一个新的事件对象,这个对象会在文档的根目录(树的顶端html)中创建,然后,在所谓的捕获阶段,这个事件对象将会沿着整个树传播,一直到它到达目标元素(我们点击的那个button),我们可以通过在这个目标元素中放置事件处理程序函数来处理事件,在到达目标元素之后,事件对象就会立刻沿着整个树向上移动,也就是在所谓的起泡阶段。

React处理事件实际上是对应用程序中的所有事件执行事件委托,也就是将所有事件处理程序添加到根元素中。所以如果我们的代码中有多个点击处理程序,React实际上会以某种方式把它们捆绑在一起,只需要在纤维树的根节点上添加一个大的点击处理程序,可以理解为React为每个事件类型注册一个事件处理程序函数。

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 18是React的最新版本,它引入了一些新的功能和改进。在学习React 18时,你可以关注以下几个方面: 1. React组件:React组件是构建用户界面的基本单元。你可以使用React.createElement()函数或JSX语法来创建React元素和组件。React元素是不可变的,而React组件是可复用的。\[1\] 2. react-dom.development.js或react-dom/client模块:这些模块提供了处理真实DOM的功能,包括Diff算法和渲染成真实DOM的过程。你可以在HTML文件中引入这些模块,并使用ReactDOM.createRoot()方法来渲染React的DOM。\[2\] 3. Hook:Hook是React中的特殊函数,它允许你在函数组件中添加状态和其他特性。例如,useState是一个Hook,它可以让你在函数组件中添加状态。你可以使用useState来定义和更新状态,并在组件中使用它们。\[3\] 在学习React 18时,你可以通过阅读官方文档、参考教程和实践项目来深入了解这些概念和用法。同时,你也可以与其他开发者交流和分享经验,加深对React的理解。 #### 引用[.reference_title] - *1* *2* *3* [2023年React18笔记【慕课网imooc】【尚硅谷】【Vue3+React18 + TS4考勤系统】](https://blog.csdn.net/qq_28838891/article/details/124598439)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值