JSX 语法
本章节将介绍 JSX 语法,这是 React 中用于描述 UI 的语法扩展。
什么是 JSX?
JSX 是 JavaScript 的语法扩展,允许在 JavaScript 中编写类似 HTML 的代码。
const element = <h1>你好,React!</h1>;
JSX 看起来像 HTML,但实际上它是一种 JavaScript 表达式。
JSX 基础语法
1. 基本使用
// 在 JSX 中使用 HTML 标签
const element = <h1>Hello World</h1>;
// 可以在 JSX 中嵌入 JavaScript 表达式
const name = "张三";
const element = <h1>你好,{name}!</h1>;
2. 嵌入表达式
const a = 10;
const b = 20;
// 可以在 {} 中使用任何 JavaScript 表达式
const element = (
<div>
<p>a + b = {a + b}</p>
<p>今天是 {new Date().toLocaleDateString()}</p>
</div>
);
3. 条件渲染
const isLoggedIn = true;
// 使用三元运算符
const element = (
<div>
{isLoggedIn ? (
<h1>欢迎回来!</h1>
) : (
<h1>请登录</h1>
)}
</div>
);
// 使用逻辑与运算符
const element = (
<div>
{isLoggedIn && <h1>欢迎回来!</h1>}
</div>
);
4. 列表渲染
const fruits = ["苹果", "香蕉", "橙子"];
const element = (
<ul>
{fruits.map((fruit, index) => (
<li key={index}>{fruit}</li>
))}
</ul>
);
JSX 属性
1. 字符串属性
const element = <div className="container">内容</div>;
const element = <input type="text" placeholder="请输入" />;
2. JavaScript 表达式作为属性
const isActive = true;
const element = <button className={isActive ? "active" : ""}>按钮</button>;
3. 展开运算符
const props = { className: "container", id: "main" };
const element = <div {...props}>内容</div>;
JSX 与 HTML 的区别
1. className
在 JSX 中使用 className 而不是 class:
// 错误
const element = <div class="container">内容</div>;
// 正确
const element = <div className="container">内容</div>;
2. style 属性
JSX 的 style 接受一个对象,而不是字符串:
// 错误
const element = <div style="color: red; font-size: 16px;">内容</div>;
// 正确
const element = (
<div style={{ color: "red", fontSize: "16px" }}>内容</div>
);
// 更常见的写法
const styles = {
color: "red",
fontSize: "16px"
};
const element = <div style={styles}>内容</div>;
3. 自闭合标签
// 必须闭合标签
const element = <img src="logo.png" />;
const element = <input type="text" />;
4. 驼峰式命名
JSX 属性使用驼峰式命名:
// className(不是 class)
// onClick(不是 onclick)
// onChange(不是 onchange)
// tabIndex(不是 tabindex)
const element = (
<button onClick={() => alert("点击")} tabIndex={0}>
按钮
</button>
);
JSX 原理
JSX 会被编译成 JavaScript:
// JSX
const element = <h1 className="title">Hello</h1>;
// 编译后
const element = React.createElement(
"h1",
{ className: "title" },
"Hello"
);
React.createElement 会创建一个描述 DOM 结构的对象(虚拟 DOM)。
Fragment
使用 Fragment 可以避免多余的 DOM 节点:
// 会产生额外的 div 包裹
const element = (
<div>
<h1>标题</h1>
<p>内容</p>
</div>
);
// 使用 Fragment,不会产生额外的 DOM 节点
import { Fragment } from "react";
const element = (
<Fragment>
<h1>标题</h1>
<p>内容</p>
</Fragment>
);
// 简写形式
const element = (
<>
<h1>标题</h1>
<p>内容</p>
</>
);
在 JSX 中注释
const element = (
<div>
{/* 这是一个注释 */}
<h1>标题</h1>
</div>
);
小结
本章我们学习了:
- JSX 的基本语法
- 在 JSX 中嵌入 JavaScript 表达式
- 条件渲染和列表渲染
- JSX 属性的使用
- JSX 与 HTML 的区别
- Fragment 的使用
练习
- 创建一个显示当前时间的组件
- 创建一个根据条件显示不同内容的组件
- 创建一个显示水果列表的组件
- 创建一个使用样式的组件