JSX(JavaScript XML) 是 React 中用来 写 HTML 结构 的一种语法,它允许你在 JavaScript 代码中直接写 HTML 代码。
在普通 JavaScript 里,你可能会这样写:
const element = document.createElement("h1");
element.textContent = "Hello, world!";
document.body.appendChild(element);
但是,在 JSX 里,你可以像写 HTML 一样:
const element = <h1>Hello, world!</h1>;
然后用 React 渲染:
import React from "react";
import ReactDOM from "react-dom";
const element = <h1>Hello, world!</h1>;
ReactDOM.createRoot(document.getElementById("root")!).render(element);
注意:JSX 代码 最终会被编译成 JavaScript,并不会直接执行。
JSX 和 HTML 很像,但它是 JavaScript 扩展语法,有一些不同点:
HTML | JSX(React) | 说明 |
---|---|---|
class="title" |
className="title" |
JSX 里 class 变成 className |
onclick="handleClick()" |
onClick={handleClick} |
事件属性 要用 {} 括起来 |
<input disabled> |
<input disabled={true} /> |
布尔值 必须用 {} |
style="color: red;" |
style={{ color: "red" }} |
行内样式 用对象 {} |
<img src="logo.png"> |
<img src={logo} /> |
动态属性 需要 {} |
JSX 其实是 React.createElement() 的语法糖,
例如:
const element = <h1>Hello, world!</h1>;
最终会被转换成:
const element = React.createElement("h1", null, "Hello, world!");
然后 React 会 把它变成真正的 DOM。
JSX 允许你在 {}
里面写 JavaScript 表达式,比如:
const name = "Alice";
const element = <h1>Hello, {name}!</h1>;
或者:
const user = { name: "Bob", age: 25 };
const element = <p>姓名: {user.name}, 年龄: {user.age}</p>;
但不能写 if 语句、for 循环,只能写 表达式:
const isLoggedIn = true;
const element = <p>{isLoggedIn ? "已登录" : "请登录"}</p>;
必须有一个根元素:
return (
<div>
<h1>标题</h1>
<p>内容</p>
</div>
);
不能这样:
return ( <h1>标题</h1> <p>内容</p> // ❌ 这里会报错 );
如果不想多包裹
div
,可以用 Fragment:
return ( <> <h1>标题</h1> <p>内容</p> </> );
HTML 属性要用 camelCase
:
<button onClick={handleClick}>点击</button>
用 {}
写 JavaScript 代码:
const name = "React";
return <h1>Hello, {name}!</h1>;
CSS class
改成 className
:
<h1 className="title">标题</h1>
行内样式要用对象:
<h1 style={{ color: "red", fontSize: "20px" }}>标题</h1>
React.createElement()
{}
语法写 JavaScript 代码 className
、onClick
这样,React 代码就比普通 JavaScript 更简洁、更可读!