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、属性操作、事件处理中解放出来

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MicroBlaze IP核中Local Memory Bus (LMB)接口描述

LMB&#xff08;Local Memory Bus&#xff09;是一种同步总线&#xff0c;主要用于访问FPGA上的块RAM&#xff08;Block RAM&#xff0c;BRAM&#xff09;。LMB使用最少的控制信号和一个简单的协议&#xff0c;以保证块RAM能在一个时钟周期内被存取。所有的LMB信号都是高电平有…

【服务器03】之【Navicat完整版破解】

首先清掉电脑所有Navicat组件 虽然被卸载掉了但是没有彻底清理掉Navicat组件 在原装盘里找到Navicat清楚碎片 清空之后开始下载 navicat16 https://www.alipan.com/s/GTvP93mn3sU 点击链接保存&#xff0c;或者复制本段内容&#xff0c;打开「阿里云盘」APP &#xff0c;无需…

AI Workflow的敏捷开发:持续创新与优化的艺术

在人工智能的浪潮中&#xff0c;AI Workflow作为大模型落地的关键实践&#xff0c;正逐渐成为技术领域的新宠。然而&#xff0c;随着技术的发展&#xff0c;我们面临着一系列挑战&#xff0c;如何有效地应对这些挑战&#xff0c;实现AI Workflow的敏捷开发&#xff0c;成为了一…

fyne的VBox布局02

VBox布局02 最常用的布局是layout.BoxLayout&#xff0c;它有两种变体&#xff0c;水平和垂直。box布局将所有元素排列在单行或单列中&#xff0c;并带有可选的空格以帮助对齐。 一步一步实现一个如下界面布局&#xff0c;这个界面可以使用VBox布局来实现。 这次添加了2个复…

【C语言】自定义类型

目录 一、结构体&#xff1a; 1、结构体的声明&#xff1a; 2、结构体的自引用&#xff1a; 3、结构体变量的定义和初始化&#xff1a; 4、结构体内存对齐&#xff1a; 5、结构体传参&#xff1a; 6、位段&#xff1a; 二、枚举类型&#xff1a; 三、联合体&#xff1a…

【设计模式深度剖析】【10】【行为型】【状态模式】

&#x1f448;️上一篇:访问者模式 | 下一篇:解释器模式&#x1f449;️ 设计模式-专栏&#x1f448;️ 文章目录 状态模式定义英文定义直译如何理解呢&#xff1f; 状态模式的角色Context&#xff08;环境类&#xff09;State&#xff08;抽象状态类&#xff09;Concret…

Java | Leetcode Java题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution {public int majorityElement(int[] nums) {int count 0;Integer candidate null;for (int num : nums) {if (count 0) {candidate num;}count (num candidate) ? 1 : -1;}return candidate;} }

Netdata介绍

前言 Netdata是一款用于Linux系统的实时性能监测工具&#xff0c;它提供了web界面的视角&#xff0c;使得用户可以通过可视化的方式清晰地了解系统和应用程序的实时状态。 Netdata具有以下几个显著特点&#xff1a; 实时性&#xff1a;Netdata能够实时监测系统和应用程序的性…

Android-Android Studio-FAQ

1 需求 2 接口 3 Android Studio xml布局代码补全功能失效问题 最终解决方案就是尝试修改compileSdk 为不同SDK版本来解决问题&#xff0c;将原本34修改为32测试会发现xml代码补全功能有效了&#xff01; 参考资料 Android Studio xml布局代码补全功能失效问题_android studi…

电压调整+无功优化!考虑泄流效应的风电场并网点电压系统侧增援调控方法程序代码!

前言 在发电侧能源结构转型的背景下&#xff0c;中国在可再生能源发电技术上的快速发展使得电网中风电并网比例不断增大。风能资源的有效利用缓解了电力紧张&#xff0c;但由于风速的不确定性&#xff0c;风电场引起的公共耦合点&#xff08;point of common coupling&#xf…

vue3项目使用Electron打包成exe的方法与打包报错解决

将vue3项目打包成exe文件方法 一、安装 1.安装electron npm install electron --save-devnpm install electron-builder --save-dev 2.在vue项目根目录新建文件index.js // index.js// Modules to control application life and create native browser window const { app…

Map-JAVA面试常问

1.HashMap底层实现 底层实现在jdk1.7和jdk1.8是不一样的 jdk1.7采用数组加链表的方式实现 jdk1.8采用数组加链表或者红黑树实现 HashMap中每个元素称之为一个哈希桶(bucket),哈希桶包含的内容有以下4项 hash值&#xff08;哈希函数计算出来的值&#xff09; Key value next(…

基于SSM+Jsp的水果销售管理网站

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

Linux 五种IO模型

注&#xff1a;还有一种信号驱动IO&#xff0c;使用较少暂不讨论&#xff1b; 一&#xff0c;区分阻塞、非阻塞和同步、异步 看了很多文章对这两组概念解释和对比&#xff0c;说的太复杂了&#xff0c;其实没必要&#xff0c;两句话就能说清楚。 首先&#xff0c;对于读数据rec…

探索监管沙箱在金融科技行业中的应用

一、引言 随着金融科技的快速发展&#xff0c;传统金融机构与科技企业之间的竞争也日趋激烈。为了平衡金融科技创新与风险防控&#xff0c;各国监管机构纷纷引入监管沙箱&#xff08;Regulatory Sandbox&#xff09;机制。监管沙箱作为一个受监督的安全测试区&#xff0c;允许金…

Linux字节对齐小程序

#include <stdio.h> // 默认对齐 struct DefaultAligned { char c; int i; }; // 按1字节对齐 #pragma pack(push, 1) struct OneByteAligned { char c; int i; }; #pragma pack(pop) // 恢复之前的对齐设置 int mai…

Python日志管理利器:如何高效管理平台日志

一、为什么需要日志管理&#xff1f; 日志是应用程序的重要组成部分&#xff0c;它记录了应用程序的运行状态、错误信息以及用户交互等关键信息。良好的日志管理可以帮助开发人员及时发现和解决问题&#xff0c;提高应用程序的稳定性和可靠性。 项目在本地开发调试时&#xf…

基于Sringboot+Vue的校园招聘系统【原创】【开源】

浏览器&#xff1a;Chrome或360浏览器 系统环境配置 前置条件&#xff1a;系统已经安装了Mysql5.7、Mysql工具&#xff08;Navicat&#xff09;、JDK1.8、Maven3.6.1、vue3.0以下开发环境、 Intellij Idea、 Chrome或360浏览器 1、导入数据库 2、编译前端代码vue 编译&…

HTML播放flv

页面效果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

森林火灾扑救特类车辆有哪些_鼎跃安全

森林消防是在森林火灾发生时&#xff0c;为了保护森林资源&#xff0c;防止火势蔓延&#xff0c;采取了一系列的应用措施&#xff0c;针对自然环境中的火灾消防工作。森林灭火主要包括预警、预防措施、火情监测、火势控制和灭火等&#xff0c;森林火灾发生的地形往往复杂崎岖&a…