React中的JSX应该怎么用

什么是JSX

JSX = Javascript + XML,JSX是一个 JavaScript 的语法扩展。 JSX可以很好地描述 UI 应该呈现出它应有交互的本质形式并且其完全可以和JavaScript融合在一起使用。而且具有 JavaScript 的全部功能。JSX 可以生成 React “元素”。

JSX代码示例:

const element = <h1>Hello, world!</h1>;

为什么使用 JSX?

  • 支持动态渲染:使用JSX,开发者可以动态地创建UI组件,并将它们与React组件的生命周期方法相结合,从而支持动态渲染。
  • 更加安全:JSX可以帮助开发者在编译时检测类型错误,这可以避免在运行时出现未定义或无效的操作。以及JSX 中可以使用模板语法,这样可以避免了一些安全问题,如跨站脚本攻击 (XSS)。
  • 代码更加简洁清晰:使用JSX可以将HTML和JavaScript代码组合在一起,使代码更加紧凑,而不是将HTML和JavaScript代码分离开来。这使得开发者更容易阅读和理解代码。
  • 提高可维护性:JSX使代码更具可读性,这意味着维护代码所需的时间更少。使用JSX,开发者可以在同一个文件中编写HTML和JavaScript代码,这样可以更容易地找到相关的代码块。
  • 更加易于集成:由于 JSX 是 JavaScript 的一部分,因此它可以与许多其他 JavaScript 工具和库无缝集成,如 Webpack、Babel 等。

JSX的书写规范

  • 将多行 JSX 代码用括号包起来:当 JSX 代码跨越多行时,需要将其用括号包起来,以确保代码的清晰和正确性。
  • 只能有一个顶层元素:JSX 中只能有一个顶层元素,也就是说,所有的 JSX 元素必须包含在一个外层元素中。

代码示例:

// 只有一个顶层元素 
const Element = ( 
    <div> 
        <h1>Title</h1>
        <p>Paragraph</p> 
    </div> 
  );
  • 使用大写字母开头命名变量:使用小写字母开头的变量名会被解释为原生 HTML 标签。

代码示例:

// 使用大写字母开头命名变量
const Element = <div>Hello World</div>;
  • JSX中的标签可以是单标签(单标签结尾处要加上 / 符号),也可以是双标签。

代码示例:

const Element = <input type="text" />;

注意: 如果是单标签,必须以/>结尾

在 JSX 中嵌入表达式

在JSX中可以使用大括号 {} 嵌入表达式,而且在 JSX 语法中,你可以在大括号内放置任何有效的JavaScript 表达式,例如运算表达式、三元运算符、执行一个函数。

注意:不能在表达式中使用 if 语句和 for 循环等语句,但可以使用条件表达式(ternary operator)。

  • 情况一:当变量是Number、String、Array类型时,可以直接显示
  • 情况二:当变量是null、undefined、Boolean类型时,内容为空;
    • 如果希望可以显示null、undefined、Boolean,那么需要转成字符串。
    • 转换的方式有很多,比如toString方法、和空字符串拼接,String(变量)等方式;
  • 情况三:对象类型不能作为子元素(not valid as a React child)

JSX代码示例:

function formatName(user) {
  return user.firstName + user.lastName;
}

const user = {
  firstName: 'za',
  lastName: 'yyo',
};

const name ="Hello";

const element = <h1>{name},{formatName(user)}!</h1>;

ReactDOM.render(
element, 
document.getElementById('root')
);

JSX 也是一个表达式

在经过babel编译之后,JSX 表达式会被转为普通 JavaScript 函数。并且会编译运行得到最终的表达式结果。

JSX 中可以嵌入

  • 运算表达式
  • 三元运算符
  • 也可以执行一个函数
function getGreeting(user) {
  if (user) {
    return <h1>Hello, {formatName(user)}!</h1>;  }
  return <h1>Hello, Stranger.</h1>;}

JSX 可以绑定属性

我们可以使用引号来将属性值指定为字符串字面量,也可以使用大括号,来在属性值中插入一个 JavaScript 表达式。

  • 比如元素都会有title属性
  • 比如img元素会有src属性
  • 比如a元素会有href属性
  • 比如元素可能需要绑定class
  • 比如原生使用内联样式style
//使用引号将属性值指定为字符串字面量
const element = <div tabIndex="0"></div>;
//使用大括号,来在属性值中插入一个 JavaScript 表达式
const element = <img src={user.avatarUrl}></img>;

注意: 因为 JSX 语法上更接近 JavaScript 而不是 HTML,所以 React DOM 使用 camelCase(小驼峰命名)来定义属性的名称,而不使用 HTML 属性名称的命名约定。

使用 JSX 指定子元素

当我们的标签里面没有内容时,我们可以采用单标签的形式。组件同理。

const element = <img src={user.avatarUrl} />;

当然JSX里也能有很多标签,只需要把他们音()括起来。

const element = (
  <div>
    <h1>Hello!</h1>
    <h2>Good to see you here.</h2>
  </div>
);

JSX可以防止注入攻击

我们可以安全地在 JSX 当中直接插入用户输入内容,因为React DOM 在渲染所有输入内容之前,默认会进行转义。它可以确保在你的应用中,永远不会注入那些并非自己明确编写的内容。所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 XSS(cross-site-scripting, 跨站脚本)攻击。


const title = 用户输入的内容,或者请求的连接
// 直接使用是安全的:
const element = <h1>{title}</h1>;

JSX 表示对象

实际上,jsx 仅仅只是 React.createElement(component, props, …children) 函数的语法糖。
所有的jsx最终都会被转换成React.createElement的函数调用

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);

我们编写的代码最终会被转化为React.createElement的函数调用

createElement需要传递三个参数:

参数一:type

  • 当前ReactElement的类型;
  • 如果是标签元素,那么就使用字符串表示 “div”;
  • 如果是组件元素,那么就直接使用组件的名称;

参数二:config

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

参数三:children

  • 存放在标签中的内容,以children数组的方式进行存储;
  • 当然,如果是多个元素呢?React内部有对它们进行处理,
// 注意:这是简化过的结构
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world!'
  }
};

这种对象被称为 “React 元素”。它们描述了你希望在屏幕上看到的内容。React 通过读取这些对象,然后使用它们来构建 DOM 以及保持随时更新。

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

虚拟DOM(Virtual DOM)

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

  • 原因是React利用ReactElement对象组成了一个JavaScript的对象树;
  • JavaScript的对象树就是大名鼎鼎的虚拟DOM(Virtual DOM);

如何查看ReactElement的树结构呢?

我们可以将之前的jsx返回结果进行打印。注意下面代码中我打jsx的打印

image.png

ReactElement最终形成的树结构就是Virtual DOM;

为什么使用虚拟DOM?

为什么要采用虚拟DOM,而不是直接修改真实的DOM呢?

  1. 很难跟踪状态发生的改变:原有的开发模式,我们很难跟踪到状态发生的改变,不方便针对我们应用程序进行调试;

  2. 操作真实DOM性能较低:传统的开发模式会进行频繁的DOM操作,而这一的做法性能非常的低;

    • 首先,document.createElement本身创建出来的就是一个非常复杂的对象;

    • 其次,DOM操作会引起浏览器的回流和重绘,所以在开发中应该避免频繁的DOM操作;

  3. 虚拟DOM帮助我们从命令式编程转到了声明式编程的模式。使得编写效率更高

    • 你只需要告诉React希望让UI是什么状态,React来确保DOM和这些状态是匹配的,你不需要直接进行DOM操作,只可以从手动更改DOM、属性操作、事件处理中解放出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/728601.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编译原理:语法分析(语法制导翻译)、语义分析(类型检查、中间代码生成)

编译器在做语法分析的过程中&#xff0c;除了回答程序代码的语法是否合法&#xff08;LL,LR能否接收&#xff09;外&#xff0c;还需要完成后续的工作&#xff08;包括构建语法树、类型检查、中间代码生成、目标代码生成&#xff09;&#xff0c;这些后续工作一般都可以通过语法…

板凳--------第60章 SOCKET:服务器设计

60.1 迭代型和并发型服务器 1016 1.迭代型&#xff1a; 服务器每次只处理一个客户端&#xff0c;只有当完全处理完一个客户端的请求后才会去处理下一个客户端。只适用于快速处理客户端请求的场景&#xff0c;因为每个客户端都必须等待&#xff0c;直到前面所有的客户端都处理完…

10年265倍!动态展示全球第一股英伟达10年股价走势

英伟达在过去十年的股价走势展示了其在市场上的强劲表现和显著增长。自1999年上市以来&#xff0c;英伟达的股价经历了多次显著的涨幅&#xff0c;并在2024年达到了历史新高。 从2023年6月的数据来看&#xff0c;英伟达的股价为386.54美元/股&#xff0c;市值为9548亿美元。然…

redis以后台的方式启动

文章目录 1、查看redis安装的目录2、Redis以后台的方式启动3、通过客户端连接redis4、连接后&#xff0c;测试与redis的连通性 1、查看redis安装的目录 [rootlocalhost ~]# cd /usr/local/redis/ [rootlocalhost redis]# ll 总用量 112 drwxr-xr-x. 2 root root 150 12月 6…

Excel中插入的图片在不同电脑上消失的问题及解决方法

在使用Excel时插入图片&#xff0c;然后在不同电脑上打开却发现图片消失并被替换为链接地址&#xff0c;这个问题通常出现于文件中的图片路径没有正确保存或者电脑上缺少相关的图片文件。下面让我们来详细解释这个问题以及可能的解决方法。 ### 问题原因分析1. **相对路径问题…

数据结构—排序、查找、图论和字符串算法之Java实例

一&#xff1a;引言 在编程的海洋中&#xff0c;算法是程序员的灵魂之光。它们不仅指引着代码的前进方向&#xff0c;更能解决难题&#xff0c;提升效率。虽然各式各样的算法琳琅满目&#xff0c;但其中有一些却是每位程序员必定会遇到且应当深刻掌握的。本文将带您走进这些至…

从零开始学WEB前端——HTML理论讲解

有同学可能就会问&#xff1a;为什么我的创建的记事本文件名字叫“新建文本文档”而不是“新建文本文档.txt”呢&#xff1f; 这是因为.txt是后缀名&#xff0c;表示的是打开方式&#xff0c;就比如.docx后缀的都是默认用word打开&#xff0c;.xlsx的都是默认用excel打开。 常…

Linux ls-al命令实现,tree命令实现,不带缓存的文件IO(open,read,write)

shell命令 ls -al 实现 #include <43func.h> void error_check(int ret, const char *msg) {if (ret -1) {perror(msg);exit(EXIT_FAILURE);} }char get_file_type(mode_t mode) {if (S_ISREG(mode)) return -;//检查给定的文件模式&#xff08;通常是从 stat 或 lst…

【vite】define 全局常量定义

&#x1f9ed; define 说明 类型&#xff1a; Record<string, any> 定义全局常量替换方式。其中每项在开发环境下会被定义在全局&#xff0c;而在构建时被静态替换。 Vite 使用 esbuild define 来进行替换&#xff0c;因此值的表达式必须是一个包含 JSON 可序列化值&a…

WebHttpServletRequestResponse(完整知识点汇总)

额外知识点 Web核心 Web 全球广域网&#xff0c;也成为万维网&#xff08;www&#xff09;&#xff0c;可通过浏览器访问的网站 JavaWeb 使用Java技术来解决相关Web互联网领域的技术栈 JavaWeb技术栈 B/S架构&#xff1a;Browser/Server&#xff0c;即浏览器/服务器 架构模式…

海康威视-下载的录像视频浏览器播放问题

目录 1、播放异常比对 2、视频编码检查 2.1、正常视频解析 2.2、海康视频解析 2.3、比对工具 3、转码 3.1、maven依赖 3.2、实现代码 4、验证 在前面的文章&#xff08;海康威视-按时间下载录像文件_海康威视 sdk 下载录像 大小0-CSDN博客&#xff09;中&#xff0c;通…

.NET+Python量化【1】——环境部署和个人资金账户信息查询

前言&#xff1a;量化资料很少&#xff0c;.NET更少。那我就来开个先河吧~ 以下是使用QMT进行量化开发的环境部署和基础信息获取有关操作。 1、首先自己申请券商的QMT权限&#xff0c;此步骤省略。 2、登陆QMT&#xff0c;选择极简模式&#xff0c;或者独立交易模式之类的。会进…

C语言 | Leetcode C语言题解之第171题Excel表列序号

题目&#xff1a; 题解&#xff1a; int titleToNumber(char* columnTitle) {int number 0;long multiple 1;for (int i strlen(columnTitle) - 1; i > 0; i--) {int k columnTitle[i] - A 1;number k * multiple;multiple * 26;}return number; }

【Mybatis-plus】查询及更新为null或空字符串

前言 查询为 null 或者 空字符串时&#xff0c;可以使用 or() 关键字。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 查询 使用 LambdaQueryWrapper 查询 parentCode 为 null 或者 空字符串 的数据。 LambdaQueryWrapper<CompanyEntity> qu…

go 1.22 增强 http.ServerMux 路由能力

之前 server func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {fmt.Println("Received request:", r.URL.Path)fmt.Fprintf(w, "Hello, client! You requested: %s\n", r.URL.Path)})log.Println("Serv…

Gone——golang依赖注入框架介绍

文章目录 Gone是什么特性小试牛刀概念与启动流程人话版本鬼话版本代码版本 关于Logo Gone是什么 首先&#xff0c;Gone是Golang的一个轻量级的依赖注入框架&#xff0c;目前依赖注入的装配流程是通过反射来实现的&#xff1b;虽然golang的反射一直被人诟病太慢&#xff0c;但是…

RK3568平台(音频篇)音频ALSA框架

一.ALSA框架简介 ALSA表示先进linux声音架构&#xff08;Advanced Linux Sound Archiecture&#xff09;&#xff0c;它由一系列的内核驱动、应用程序编程接口&#xff08;API&#xff09;以及支持linux下声音的应用程序组成、 ALSA项目发起的原有是linux下的声卡驱动&#x…

【论文笔记】LoRA LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

题目&#xff1a;LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 来源: ICLR 2022 模型名称: LoRA 论文链接: https://arxiv.org/abs/2106.09685 项目链接: https://github.com/microsoft/LoRA 文章目录 摘要引言问题定义现有方法的问题方法将 LORA 应用于 Transformer 实…

双写一致性

双写一致性 当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致。 注意这里是对数据库进行写操作而不是读操作&#xff0c;通常我们有两种方式完成这个写操作&#xff0c;分别是&#xff1a;先删除缓存再修改数据库 和 先修改数据库再删除…

并发锁机制

JDK1.6 synchronized &#xff08;底层是由C实现的&#xff09;&#xff1a; synchronized: 互斥锁&#xff0c;悲观 锁&#xff0c;同步锁&#xff0c;重量级锁&#xff08;耗性能&#xff09;&#xff0c;多线程使用重量级锁很容易发生线程阻塞&#xff0c;因为涉及到多个线程…