什么是JSX?

一、基本概念及用法:

JSX(JavaScript XML)是一种语法扩展,常用于 React 以描述用户界面(UI)。它看起来很像 HTML,但实际上它是 JavaScript 的一种语法糖,允许开发者在 JavaScript 代码中编写类似 HTML 的语法。

书写形式:

  • HTML上凿洞,动态数据露脸

在用React写界面的时候,先写一段HTML作为页面的静态结构,再用大括号标记,加入动态的、可交互的元素,这就像在墙上凿个洞,让动态数据从墙后漏出了脸

{}就像一个洞

React=JS中混写HTML

基本用法:

import React from 'react';const Greeting = ({ name }) => {return (<div><h1>Hello, {name}!</h1><p>Welcome to our website.</p></div>);
};export default Greeting;

 JSX 的优势

  • 可读性: JSX 使得组件的结构更加直观,易于理解和维护。
  • 强大的功能: 结合 JavaScript 可以实现动态和复杂的用户界面。
  • 编译为 JavaScript: JSX 代码在构建过程中会被转换为 React.createElement 调用,从而生成虚拟 DOM。

注意事项

  • 必须有一个父元素: 在 JSX 中,返回的元素必须被一个单一的父元素包裹。
  • 使用 Babel 转换: 在实际应用中,JSX 代码通常需要使用 Babel 进行转换,以便浏览器能够理解。

二、深入理解JSX语法

1.JSX是伪装成HTML的JavaScript代码

function App() {return <div>111</div>
}

这个组件是一个JavaScript函数,并返回了一个值(return后面的部分)

混写在React代码里的标签也不是真正的HTML,而是一种特殊的标签,大名叫做JSX,这里JS指的是JavaScript, X 有扩展(extension)的意思,也表示它与另外一种标记语言XML其实更接近

JSX只是伪装成HTML标签,其实质是JavaScript代码,在发送到浏览器执行之前,React开发工具将JSX标签自动转换为相应的JavaScript代码:

<div>111</div>

与下面的代码是等效的:

_jsx("div",{ children: "111"})

这里的_jsx是开发工具自动导入的一个函数:

import { jsx as _jsx } from "react/jsx-runtime"

所以组件也可以写成:

import { jsx as _jsx } from "react/jsx-runtime"
function App {return _jsx("div",{ children: "111"})
}
 带className的转换:
<div className="mr-wall"></div>
_jsx("div",{ className: "mr-wall"})
嵌套标签:
<div><button />
</div>
_jsx("div",{ children: _jsx("button")})

children是一个特殊的属性,包含了嵌套在div里的标签,或者说是div的"孩子" 而button同时也是一个jsx标签,所以children的值是再一次调用_jsx的结果,而不是一个简单的字符串

<div>11{alan}22</div>

转换为:

_jsx("div", {children:["11",alan,"22"]})

当有花括号的时候,标签内容被拆分为多个"孩子",并包括在一个数组内.因为alan不是字符串,而是定义在目前作用范围内的一个变量,所以在转换后的代码里没有加引号,而是直接引用了alan

示例:

<div className = "container"><div className="mr-wall">11{alan}22</div><button />
</div>

转换成JavaScript:

_jsx("div",{className: "container",children:[_jsx("div", { className: "mr-wall", children: ["11",alan,"22"]}),_jsx("button"),],
});

2.JSX的返回值:

function App(){const result = _jsx("input", {});console.log(result); // 打印到控制台return result;
}

控制台结果:

Object {type: "input", key:null, ref:null, props:Object, _owner:null}

_jsx函数创建并返回了一个简单的JavaScript对象,跟DOM元素没有什么关系,这个对象的正式名称是React元素(React element),其作用只是描述我们期望在浏览器中看到的结果

3.JSX是一个表达式:

JSX标签赋值给变量或者将其作为参数在调用函数的时候传过去,或者打印在控制台上

let content = <div>咔嚓</div>
showAlert(<input />)
console.log(<div>111</div>)

JSX标签是函数调用( _jsx(...) ),既然是函数调用,JSX标签就是一个JavaScript表达式,可以卸载任何能容纳表达式的地方

_jsx创建的只是一个简单的对象,并不是DOM节点,所以它没有办法appendChild方法供我们使用

4.理解JSX和HTML的区别

// JSX
<input style = {{ minWidth: 200}} />// HTML
<input style = "min-width: 200px" />

为什么这里有两层大括号,为什么不是单层大括号? 为什么不是引号?

  • 第一层括号其实就是墙上那个"洞"
  • 第二层括号是JavaScript对象的界定符

所以,这里的sytle属性的值是一个对象,这也解释了为什么括号内是{ minWidth:200 },而不是{ minWidth:200px } 或者 { min-width: 200px },因为后面两个都不是对象的正确写法

第一层是告知这个地方要动态填参数,第二层是传递一个对象,给这个style属性传递一个对象

基于同样的原因,当CSS属性值不是数字时,我们需要使用引号,比如,设置背景颜色时用

<div style = {{ background: "red" }}>

而不是:

 <div style = {{ background:red}}></div>

当然,上述是标准的React支持的方法,有一些第三方库(如 styled-components,emotion)可以让我们在JavaScript代码里加入真正的CSS代码,其格式完全原汁原味.我们甚至可以直接从网上复制一段CSS代码放到程序里,不过这些库的实现仍基于上述的标准方法

JSX和HTML的区别

这一表格总结了 JSX 和 HTML 在多个方面的主要区别。JSX 是一种 JavaScript 语法扩展,专为 React 设计,具有更强的表达能力和灵活性,而 HTML 是标准的网页标记语言。

特性

JSX

HTML

闭合要求

所有标签必须闭合,包括单标签

(如 <img />)

单标签可以不闭合

(如 <img> )

属性命名标准

使用小驼峰命名法(如className、onClick)。

使用小写字母和短横线(如

class、onclick)

自定义标签

支持自定义标签(如<MyComponent /> )

只允许使用标准 HTML 标签

模板支持

支持内联表达式(如 {expression})

不支持内联表达式,只能静态内容

引用 CSS 类

使用 className 属性来引用 CSS 类

使用 class 属性来引用 CSS 类。

内嵌样式

使用对象语法,例如 style={{ color: 'red' }}

使用字符串语法,例如

style="color: red;"

textarea

直接使用,内容必须用{value} 来控制

直接使用,内容为标签之间的文本。

label

需要使用 htmlFor 属性

<label htmlFor = "input-id">

使用 for 属性

<label for = "input-id">

select

直接使用,支持 React 的受控组件

使用select标签的value属性标识当前选项,如:

<select value = "打">...</select>

直接使用,不支持受控组件的概念

使用option标签的selected属性标识当前选项,如:

<option selected>打</option>

总结:

 JSX就是JavaScript代码,要遵循JavaScript代码规则,当然,我们还可以把JSX看成增强型的HTML,因为它可以支持自定义标签等高级功能

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

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

相关文章

H.265流媒体播放器EasyPlayer.js视频流媒体播放器关于直播流播放完毕是否能监听到

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0c;也能支持WebS…

《基于 PySpark 的电影推荐系统分析及问题解决》

以下是一篇关于上述代码的博客文章&#xff1a; 基于PySpark的电影推荐系统实现与分析 在当今数字化时代&#xff0c;个性化推荐系统在各个领域中都发挥着至关重要的作用&#xff0c;尤其是在娱乐行业&#xff0c;如电影推荐。本文将详细介绍如何使用PySpark构建一个简单的电…

【Java 学习】数据类型、变量、运算符、条件控制语句

Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量&#xff1f;什么是数据类型&#xff1f;2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …

性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告

云器Lakehouse正式发布性能测试报告 &#x1f3c5;离线批处理&#xff1a;在复杂批处理任务中&#xff0c;云器Lakehouse相较Spark表现出13.31倍性能提升。 &#x1f3c5;即席查询&#xff1a;在交互式分析场景下&#xff0c;云器Lakehouse相较Trino表现出9.84倍性能提升。 &am…

【MySQL】RedHat8安装mysql9.1

一、下载安装包 下载地址&#xff1a;MySQL Enterprise Edition Downloads | Oracle MySQL :: MySQL Community Downloads 安装包&#xff1a;mysql-enterprise-9.1.0_el8_x86_64_bundle.tar 官方 安装文档&#xff1a;MySQL Enterprise Edition Installation Guide 二、安装…

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时&#xff0c;有些时候&#xff0c;需要和第三方进行调式&#xff0c;但是第三方不在一起&#xff0c;需要进行远程调试&…

蜀道山CTF<最高的山最长的河>出题记录

出这道题的最开始感觉就是,因为现在逆向的形式好多,我最开始学习的时候,经常因为很多工具,或者手段完全不知道,就很懵逼,很多师傅都出了各种类型的,我就想着给以前的"自己"出一道正常exe,慢慢调的题,为了不那么简单,我就选择了C(究极混淆,可能比rust好点),让大家无聊…

Quartus+Nios II for eclipse问题合集

由于对于FPGANIOS II 的工作需要&#xff0c;对工作过程中遇到的问题进行记录&#xff0c;持续更新。 1、BSP directory does not exist: . Stop.Nios II使用过程中遇到的一些问题2_error executing nios2-bsp-generate-files --bsp-di-CSDN博客https://blog.csdn.net/qq_39485…

AWTK VSCode 实时预览插件端口冲突的解决办法

AWTK XML UI 预览插件&#xff1a;在 vscode 中实时预览 AWTK XML UI 文件&#xff0c;在 Copilot 的帮助下&#xff0c;可以大幅提高界面的开发效率。 主要特色&#xff1a; 真实的 UI 效果。可以设置主题&#xff0c;方便查看在不同主题下界面的效果。可以设置语言&#xf…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时&#xff0c;获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法&#xff0c;您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

如何对AWS进行节省

AWS 云服务器的费用确实可能会让人感到高昂&#xff0c;尤其是在资源使用不当或配置过多的情况下。不过&#xff0c;通过一些策略的合理应用和优化&#xff0c;完全可以降低云服务的使用成本&#xff0c;实现高效节省。以下是九河云总结的几种主要的优化方法&#xff0c;帮助你…

Macmini中普通鼠标与TrackPad联动问题解决

入手了一款Macmini&#xff0c;然后接了一个普通鼠标&#xff0c;然后又买了一个TrackPad。 接下来&#xff0c;问题来了&#xff0c;这两个玩意之间是联动的&#xff0c;出现问题的地方在于鼠标滚轮对于页面内容滚动的方向上。 通常Windows系统中&#xff0c;鼠标滚轮向前&am…

基于Spring Boot+Unipp的博物馆预约小程序(协同过滤算法、二维码识别)【原创】

&#x1f388;系统亮点&#xff1a;协同过滤算法、二维码识别&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

目录 深入理解 JavaScript 中的 Array.find() 方法&#xff1a;原理、性能优势与实用案例详解 一、引言&#xff1a;为什么要使用Array.find() 二、Array.find()的使用与技巧 1、基础语法 2、返回值 3、使用技巧 三、Array.find()的优势与实际应用案例 1、利用返回引用…

安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机

随着药厂对设备运维需求的增长&#xff0c;制药装备企业需要在提高运维效率的同时&#xff0c;降低人工及差旅成本。制药装备因其数据具有高度的保密性&#xff0c;要求运维工程师提供安全可靠的远程调试方式。本案例介绍了明达技术MBox20系列5口WIFI通用网关在制药装备上的应用…

HBase 开发:使用Java操作HBase

1、实战简介 HBase和Hadoop一样&#xff0c;都是用Java进行开发的&#xff0c;本次实训我们就来学习如何使用Java编写代码来操作HBase数据库。 实验环境&#xff1a; hadoop-2.7 JDK8.0 HBase2.1.1 2、任务 1、第1关&#xff1a;创建表 package step1; import java.io.IOE…

vulhub之log4j

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 Apache Log4j 在应用程序中添加日志记录最…

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记&#xff1a;学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

Ubuntu22.04基于ROS2-Humble安装moveit2教程(亲测)

一、安装ROS2-Humble 1、参考&#xff1a;Ubuntu22.04安装ROS2-humble-CSDN博客 2、确保安装完成 source /opt/ros/humble/setup.bash 方法一&#xff1a;二进制安装 sudo apt install ros-humble-moveit* 方法二&#xff1a;安装源码编译 一、卸载二进制安装包 sudo a…

一些常见网络安全术语

1、黑帽 为非法目的进行黑客攻击的人&#xff0c;通常是为了经济利益。他们进入安全网络以销毁&#xff0c;赎回&#xff0c;修改或窃取数据&#xff0c;或使网络无法用于授权用户。这个名字来源于这样一个事实&#xff1a;老式的黑白西部电影中的恶棍很容易被电影观众识别&…