React 入门教程系列(三)——JSX 和 虚拟 DOM

2023-11-17

1. JSX

JSX的全称是 JacaScript XML,是 React 定义的第一种类似于 XML 的 JS 拓展语法。

JSX 的语法大致遵循下面几条:

  • 标签名任意
  • 标签属性任意
  • 遇到< 符号,以标签的语法进行解析
  • 遇到{符号,以 js 语法解析,js代码必须用 {} 包含

JSX 的作用是用来创建 react 虚拟 DOM 对象,例如下面的代码:

var vDom = <h1>Hello React!</h1>

值得注意的是,上面的代码不是字符串,也不是 HTML/XML 标签,也不是存粹的 JavaScript 代码,上面代码最终产生的就是一个 JS 对象。

上面的一段 code 会被 babel解释成如下代码:

var vDom = React.createElement('h1', {}, 'Hello React')

React 对象直接调用 createElement 函数,函数接受三个参数:

  1. 第一个是要渲染的标签
  2. 第二个传入标签相关属性,例如 title、id等等
  3. 第三个参数则是传入标签中的文本。

2. 虚拟 DOM

在之前使用原生 JavaScript 或者 jQuery 操作 DOM 是一件非常麻烦的事情,DOM 标签和 JavaScript 代码混在一起,编写困难且不易阅读。另外,频繁的操作 DOM 也会带来性能上的问题。

虚拟 DOM 的出现,很好的解决了上面的问题。

虚拟 Dom 可以看作是使用 JavaScript 代码模拟 DOM 结构的树形结构,DOM 中的标签、内容对应着 JavaScript 代码中以 key-value 的对象,例如下图:

在这里插入图片描述

在 React 中创建虚拟 DOM 有两种方法:

  • 第一种是使用纯 JavaScript 代码进行创建
  • 第二种方式是使用 JSX 的语法,通过 babel 对这种语法进行解释成浏览器可识别的 JS 代码。

具体使用可以查看下面两个实例。

3. 实例1

下面我们就分别尝试使用 JSX 语法和纯 JavaScript 代码两种方式向页面输出内容。

首先来看看效果:

在这里插入图片描述

创建一个 html 文件,引入相关库文件,这里分别创建两个<script>标签,用两种方式输出。

直接上代码:

  <script type="text/javascript">
    const jsx = 'With JSX';
    const js = 'With JS';
    const elementId = 'element';
	// 纯 JavaScript 代码
    // 1.创建虚拟DOM
    const vDom1 = React.createElement('h2', {id: elementId.toLowerCase()}, js.toUpperCase())
    // 2.渲染虚拟DOM
    ReactDOM.render(vDom1, document.getElementById('test1'));
  </script>

  <script type="text/babel">
    // 使用JSX语法来写
    // 1.创建虚拟DOM
    const vDom2 = <h2 id={elementId.toUpperCase()}>{jsx.toLowerCase()}</h2>
    // 2.渲染虚拟DOM
    ReactDOM.render(vDom2, document.getElementById('test2'));
  </script>

可以看到,上面使用了两个<script>标签,但两个标签的 type 属性不同。一个使用纯 JavaScript 代码创建虚拟 DOM, 另一个使用 JSX 语法创建虚拟 DOM。

通过比较,使用 JSX 语法其实更为直观。

4. 实例2

看了上一个例子,相信对 JSX 语法有一定理解,下面继续使用 JSX 语法完成下面的界面。即一个 <ul>列表,其中嵌套着一些 item,这里要求列表项需循环读取。

在这里插入图片描述
直接上代码:

  <script type="text/babel">
    // 功能:动态显示列表数据
    const names = ['jack', 'pony', 'tom', 'bill'];

    // 关键:如何将一个数组的数据转换为一个标签的数组
    // 1. 创建虚拟 DOM
    const ul = (
      <ul>
        {
          names.map((name, index) => 
            // 这里需要加上 key,否则会有警告
            <li key={index}>{name}</li>
          )
        }
      </ul>
    );
    // 2. 渲染虚拟 DOM
    ReactDOM.render(ul, document.getElementById('list1'))
  </script>

这里需要注意的是,使用 map 循环虚拟 DOM 时,需要为元素加上 key 属性,否则会报如下警告⚠️:

在这里插入图片描述
这是因为 React 中 element diff 算法,为了优化渲染性能的一种策略。

5. 源码

实例1:https://github.com/Mayandev/react-tutorial/blob/master/code/react-jsx/react-jsx.html
实例2:https://github.com/Mayandev/react-tutorial/blob/master/code/react-jsx/react-jsx-practice.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 入门教程系列(三)——JSX 和 虚拟 DOM 的相关文章

随机推荐

  • 音视频开发基础概述 - PCM、YUV、H264、常用软件介绍

    前言 相对而言 音视频开发算是有些门槛的 记得我第一次接触的时候 看别人的博客都看不懂 特别是写代码的时候 非常痛苦 只能抄别人的代码 却不知道为什么要这么写 也不知道应该怎么调整 后来总结了一下 痛苦的原因是在写代码之前没有掌握相关的基础
  • 【2023最新版】Windows11家庭版:安卓子系统(WSA)安装及使用教程【全网最详细】

    目录 一 准备工作 1 检查虚拟化功能 2 找到 Wndows功能 3 启用Hyper V和虚拟机平台 4 家庭版安装Hyper V 若步骤3找不到Hyper V 二 安装安卓子系统 1 进入开发者选项 2 下载Windows Subsys
  • mmclassification数据集并训练

    mmclassification数据集并训练 1 数据集准备 import numpy as np import os import shutil 生成train txt和val txt train path train train out
  • mvnrepository仓库

    1 查找jodconverter的maven配置 2 打开mvnrepository仓库 https mvnrepository com 输入jodconverter 3 4
  • EFK实战Kibana之查询语法、导出CSV文件、安装插件(持续更新中)

    概述 EFK 是ELK即ElasticSearch Logstash Kibana的升级版 把Logstash替换成Fluentd 实战 查询语法 选择日志索引后 搜索 可以简单的使用 Lucene通用的语法 或使用基于JSON格式Quer
  • Leetcode 13. 罗马数字转整数(关于枚举)

    罗马数字包含以下七种字符 I V X L C D 和 M 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如 罗马数字 2 写做 II 即为两个并列的 1 12 写做 XII 即为 X II 27 写
  • 机器学习中的多分类任务入门

    摘要 这篇文章主要是关于机器学习中多分类任务的一些基本知识 1 我先抛出一个问题 在LR 逻辑回归 中 如何进行多分类 一般下 我们所认识的lr模型是一个二分类的模型 但是 能否用lr进行多分类任务呢 答案当然是可以的 不过 我们需要注意的
  • VSCode运行Java报错No delegateCommandHandler for vscode.java.resolveMainMethod

    VSCode运行Java报错No delegateCommandHandler for vscode java resolveMainMethod 今天快气死了 平时vscode好好的 今天不知道怎么了 运行Java程序突然报错No del
  • Python: Decorator Pattern

    DuDecorator py 装饰模式 Decorator Pattern import six https pypi org project six from abc import ABCMeta six add metaclass AB
  • 中断和串口的介绍

    一 中断的介绍 1 什么是中断 中断是指计算机运行过程中 出现某些意外情况需要主机干预时 机器能自动停止正在运行的程序并转入处理新情况的程序 处理完毕后又返回原被暂停的程序继续运行 2 中断都有哪些 中断主要分为系统中断和外部中断 3 中断
  • GauGAN (SPADE) 水记 (seg2img)

    GauGAN SPADE 水记 seg2img 根据语义mask生成图像 论文 Semantic Image Synthesis with Spatially Adaptive Normalization https arxiv org p
  • rsa非对称加密

    RsaUtil 私钥加密 公钥解密 import lombok extern slf4j Slf4j import sun misc BASE64Decoder import sun misc BASE64Encoder import ja
  • 在python中输入10个整数并求出最大值_python练习题 :用户任意输入10个整数到列表中,然后由大到小排列并输出。...

    一 填空题 1 python是一种面向 对象 的高级语言 2 python可以在多种平台运行 这体现了python的 可移植 特性 3 python源代码被解释器转换后的格式为 pyc 4 python3 x默认使用的编码是 UTF 8 5
  • 对数和指数

    参考 https www zhihu com question 21453993 这就相当于先发明减法符号 再发明加法符号 1614年 纳皮尔发明了对数和对数表 1637年 法国数学家笛卡儿发明了指数 比对数晚了20多年 1770年 欧拉才
  • 判断设备联网状态(Python)

    判断设备联网状态 Python 在Python中利用socket来判断设备是否联网 通过ping命令来验证设备的网络状态 完整代码如下 import socket def isNetOK testserver s socket socket
  • zed双目摄像头 +yolo进行双目测距

    zed双目摄像头 yolo进行双目测距 首先根据你电脑或者jetson系列中的cuda版本下载对应的zed sdk 去安装zed api 安装过程可能会出现import pyzed sl as sl ImportError DLL load
  • b站黑马的Vue快速入门案例代码——计数器

    目录 目标效果 重点原理 1 创建Vue实例的时候 2 v on 为元素绑定事件 3 v text 解析文本用 设置标签的文本值 v text 简写 为 实现步骤 代码部分 1 计数器模板 html 全是重点 2 index css 辅助作
  • ubuntu下安装jdk

    ubuntu下的jdk 氛围open jdk和oracle jdk两种 前者是开源的 其实也行 不过大部分人使用的还是oracle jdk 有些博客推荐用ppa的方式安装 但这个安装的链接被墙了 所以经常会安装失败 现在介绍另一种 手动解压
  • 解决vscode远程安装插件不了、安装太慢问题

    一 问题描述 一直显示正在安装 几个小时也没动静 特别是那个c c 插件的安装 二 解决方法 1 采用手动安装插件的方式 步骤 先去这个网站找你要安装的插件 然后下载到本地电脑 All categories Extensions Visua
  • React 入门教程系列(三)——JSX 和 虚拟 DOM

    文章目录 1 JSX 2 虚拟 DOM 3 实例1 4 实例2 5 源码 1 JSX JSX的全称是 JacaScript XML 是 React 定义的第一种类似于 XML 的 JS 拓展语法 JSX 的语法大致遵循下面几条 标签名任意