JSX 的全称是 JavaScript XML,它是一种 JavaScript 的语法扩展,允许我们在 JavaScript 中编写类似 HTML 的代码。它的主要作用是让开发者更直观地描述 UI 的结构。
我们可以直接在 JS 代码中,把 JSX 语法当成一种表达式进行运算与赋值。
const element = <h1>Hello, JSX!</h1>
从长相上来说,它跟 html 标签几乎没有差别,但它不是 html。我们可以在 JavaScript 代码中任意拆分组合这些元素。
例如,一段完整的 html 元素如下:
1<div>2<header>header</header>3<span>hello world.</span>4<footer>footer</footer>5</div>
而 JSX 可以这样写
1const header = <header>header</header>23const div = (4<div>5{header}6<span>hello world.</span>7<footer>footer</footer>8</div>9)
还可以这样
10const header = <header>header</header>2030function footer() {40return <footer>footer</footer>50}6070const div = (80<div>90{header}10<span>hello world.</span>11{footer()}12</div>13)
这样的灵活性,为开发者在拆分逻辑时提供了巨大的想象空间。我们可以抽离任意部分单独处理,也可以将任意部分通过合适的方式组合在一起。
注意:JSX 代码需要在 React 环境之下才有效。并且我们需要将具备 JSX 代码的模块文件以
.jsx
或者.tsx
为后缀名。
在 JSX 中,开发者可以在大括号中放置任何有效的 JavaScript 表达式。例如
const element = <div>计算结果:{2 + 2}</div>
或者
10function formatName(user) {20return user.firstName + ' ' + user.lastName;30}4050const user = {60firstName: 'Harper',70lastName: 'Perez'80};9010const element = (11<h1>12Hello, {formatName(user)}!13</h1>14);
JSX 中的属性(类似于 HTML 的属性)可以是字符串,也可以是 JavaScript 表达式。
1const url = 'https://example.com';2const element = <img src={url} alt="Example" />;
JSX 本身也是一个表达式,例如可以作为一个函数的返回结果。从视觉上看他是一个标签,但是当我们对其取值时,它本质是一个 JavaScript 对象。
在开发环境中,Babel 会把 JSX 编译成为一个名为 React.createElement()
的函数调用,如下两种写法完全等效
1const element = (2<h1 className="greeting">3Hello, world!4</h1>5);
1const element = React.createElement(2'h1',3{className: 'greeting'},4'Hello, world!'5);
他们创建了一个这样的对象
1// 注意:这是简化过的结构2const element = {3type: 'h1',4props: {5className: 'greeting',6children: 'Hello, world!'7}8};
标签元素是 React 组件的重要组成部分。
在开发中,我们通常会使用 JSX 的可任意拆分组合的特性,将整个项目拆分成许多模块,并最后组合成一个完整的 JSX,并使用 createRoot
渲染到已经存在的根 DOM 节点中。
1import React from 'react';2import { createRoot } from 'react-dom/client'34import './index.css';5import App from './App';678const root = createRoot(document.getElementById('root'))9root.render(<App />)
这些与 html 元素类似的标签元素,被称之为 React 元素。他们是不可变对象。一个元素就像电影中的一帧,它代表了某个特定时刻的 UI。
我们可以利用 React 元素创建自定义组件。
1function Welcome(props) {2return <h1>Hello, {props.name}</h1>;3}
每个自定义组件,也可以看成是一个 React 元素。
1const element = <Welcome name="Tony" />;2...
10// bad20const element = (30<h1>Title</h1>40<p>Content</p>50);6070// good80const element = (90<div>10<h1>Title</h1>11<p>Content</p>12</div>13);
1// 而不是 class2const element = <div className="container">Content</div>;
1// for -> htmlFor2const element = <label htmlFor="name">Name</label>;
1const element = <div2style={{ color: 'red', fontSize: '20px' }}3>4Styled Text5</div>;
本文主要内容在于阐述 JSX 语法并明确标签语言的本质,使用时重点要关注其可任意拆分组合的特性。他的灵活性在开发时非常有用。
JSX 最初是专门为 React 设计的,但是发展到现在,其他库也陆续支持了这种表达 UI 的方式,例如 Vue、Solidjs、Preact 等。