返回顶部
首页 > 资讯 > 前端开发 > JavaScript >React基础-JSX的本质-虚拟DOM的创建过程实例分析
  • 644
分享到

React基础-JSX的本质-虚拟DOM的创建过程实例分析

ReactJSX虚拟DOM 2023-05-20 05:05:15 644人浏览 独家记忆
摘要

jsX的本质 实际上,jsx仅仅只是 React.createElement(component, props, ...children) 这个函数的语法糖。 所有的jsx最终都会被

jsX的本质

实际上,jsx仅仅只是 React.createElement(component, props, ...children) 这个函数的语法糖

所有的jsx最终都会被转换成React.createElement的函数调用。

createElement需要传递三个参数:

参数一:type

当前元素的类型;

如果是标签元素,那么就使用字符串表示, 例如 “div”;

如果是组件元素,那么就直接使用组件的名称;

参数二:config

所有jsx中的属性都在config中以对象的属性和值的形式存储;

比如传入className作为元素的class;

参数三:children

存放在标签中的内容,以children数组的方式进行存储;

当然,如果是多个元素呢?React内部有对它们进行处理,处理的源码在下方

在这里插入图片描述

我们知道默认jsx是通过babel帮我们进行语法转换的,所以我们之前写的jsx代码都需要依赖babel; 我们可以在babel的官网中快速查看转换的过程: 链接: https://babeljs.io/repl/#?presets=react

例如有下面这样一段jsx代码

class App extends React.Component {
  constructor() {
    super()
  }
  render() {
    return (
      <div>
        <div className="header">Header</div>
        <div className="content">
          <div>Banner</div>  
          <ul>
            <li>轮播图1</li>
            <li>轮播图2</li>
            <li>轮播图3</li>
            <li>轮播图4</li>
            <li>轮播图5</li>
          </ul>
        </div>
        <div className="footer">Footer</div>
      </div>
    )
  }
}
const app = ReactDOM.createRoot(document.querySelector("#app"))
app.render(<App/>)

在这里插入图片描述

那么也就是说我们可以自己来编写React.createElement代码:

我们没有通过jsx来书写了,界面依然是可以正常的渲染。

另外,在我们编写原生的React情况下,我们就不需要babel相关的内容了(当然真实开发中我们是不会编写原生的React的)

  • 所以,type="text/babel"可以被我们删除掉了;
  • 所以,<script src="../react/babel.min.js"></script>也可以被我们删除掉了;
<div></div>
<script src="../lib/../lib/react.js"></script>
<script src="../lib/react-dom.js"></script>
<script>
  class App extends React.Component {
    constructor() {
      super()
    }
    render() {
      const element = React.createElement("div", null, React.createElement("div", {
          className: "header"
        }, "Header"), React.createElement("div", {
          className: "content"
        }, React.createElement("div", null, "Banner"), React.createElement("ul", null, React.createElement("li", null, "\u8F6E\u64AD\u56FE1"), React.createElement("li", null, "\u8F6E\u64AD\u56FE2"), React.createElement("li", null, "\u8F6E\u64AD\u56FE3"), React.createElement("li", null, "\u8F6E\u64AD\u56FE4"), React.createElement("li", null, "\u8F6E\u64AD\u56FE5"))), React.createElement("div", {
          className: "footer"
        }, "Footer"));
        return element
    }
  }
  const app = ReactDOM.createRoot(document.querySelector("#app"))
  app.render(React.createElement(App, null))
</script>

虚拟DOM的创建过程

我们通过 React.createElement 最终创建出来一个 ReactElement对象:

这个ReactElement对象是什么作用呢?React为什么要创建它呢?

原因是React利用ReactElement对象组成了一个javascript的对象树;

JavaScript的对象树就是虚拟DOM(Virtual DOM);

如何查看ReactElement的树结构呢?

我们可以将上面代码中的jsx返回结果进行打印;

在这里插入图片描述

**而ReactElement最终形成的树结构就是虚拟DOM (Virtual DOM) **;

虚拟DOM帮助我们从命令式编程转到了声明式编程的模式

React官方的说法:Virtual DOM 是一种编程理念

在这个理念中,UI以一种理想化或者说虚拟化的方式保存在内存中,并且它是一个相对简单的JavaScript对象

我们可以通过root.render让 虚拟DOM 和 真实DOM同步起来,这个过程中叫做协调(Reconciliation);

这种编程的方式赋予了React声明式的API:

你只需要告诉React希望让UI是什么状态;

React来确保DOM和这些状态是匹配的;

你不需要直接进行DOM操作,就可以从手动更改DOM、属性操作、事件处理中解放出来;

 PS:笔者在进行相关测试或开发的时候比较喜欢实用vite搭建Vue或react的运行环境,使用命令 npm init vite@latest 创建基本的项目框架,再进行相关调试。

理解虚拟DOM有助于我们更加深入的理解react、vue等框架的运行原理。

--结束END--

本文标题: React基础-JSX的本质-虚拟DOM的创建过程实例分析

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

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

猜你喜欢
  • React基础-JSX的本质-虚拟DOM的创建过程实例分析
    JSX的本质 实际上,jsx仅仅只是 React.createElement(component, props, ...children) 这个函数的语法糖。 所有的jsx最终都会被...
    99+
    2023-05-20
    React JSX 虚拟DOM
  • Java基础之创建虚拟机对象的过程详细总结
    目录一、对象的创建1.1 new 类名1.2 分配内存1.3 初始化零值1.4 设置对象信息1.5 构造对象二、对象的内存布局2.1 对象头2.2 实例数据2.3 对齐填充三、对象的...
    99+
    2024-04-02
  • Vue中的虚拟DOM和Diff算法实例分析
    这篇文章主要介绍了Vue中的虚拟DOM和Diff算法实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue中的虚拟DOM和Diff算法实例分析文章都会有所收获,下面我们一起来看看吧。简单介绍一下 虚拟DO...
    99+
    2023-06-29
  • react生命周期的三个过程实例分析
    今天小编给大家分享一下react生命周期的三个过程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2024-04-02
  • Go语言基础切片的创建及初始化示例分析
    这篇文章主要介绍“Go语言基础切片的创建及初始化示例分析”,在日常操作中,相信很多人在Go语言基础切片的创建及初始化示例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言基础切片的创建及初始化示例分析...
    99+
    2023-06-25
  • Seurat | 强烈建议收藏的单细胞分析标准流程(基础质控与过滤)(一)
    1. 写在前面 作为现在最火的scRNAseq分析包,Seurat当之无愧。😘 本期开始我们介绍一下Seurat包的用法,先从基础质控和过滤开始吧。🥳 2.用到的包 r...
    99+
    2023-09-04
    服务器 前端 数据库
  • MySQL存储过程的创建、调用与管理的案例分析
    这篇文章主要介绍MySQL存储过程的创建、调用与管理的案例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!存储过程简介为什么要用存储过程?MySQL5.0 版本开始支持存储过程。大多数 SQL 语句都是针对一个或多...
    99+
    2023-06-14
  • C#线程的创建和生命周期实例分析
    本篇内容介绍了“C#线程的创建和生命周期实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1,获取当前线程信息Thread.Curren...
    99+
    2023-06-29
  • MySQL创建存储过程并循环添加记录的案例分析
    这篇文章将为大家详细讲解有关MySQL创建存储过程并循环添加记录的案例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先创建,然后调用:-- 创建存储过程 DELIMI...
    99+
    2024-04-02
  • Python selenium的基本元素与键盘鼠标模拟事件实例分析
    本篇内容主要讲解“Python selenium的基本元素与键盘鼠标模拟事件实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python selenium的基本元素与键盘鼠标模拟事件实例分...
    99+
    2023-07-02
  • redis集群不通过reids-trib脚本创建3主3从redis集群的示例分析
    这篇文章主要介绍redis集群不通过reids-trib脚本创建3主3从redis集群的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  1、启动126,127,128 3个7000端口redis(...
    99+
    2023-06-06
  • mysql创建存储过程实现往数据表中新增字段的方法分析
    本文实例讲述了mysql创建存储过程实现往数据表中新增字段的方法。分享给大家供大家参考,具体如下: 需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作;若该字段不存在,则新增) 百度了n久...
    99+
    2024-04-02
  • mysql存储过程基础之遍历多表记录后插入第三方表中的示例分析
    这篇文章主要介绍mysql存储过程基础之遍历多表记录后插入第三方表中的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言自从学过存储过程后,就再也没有碰过存储过程,这是毕业后...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作