JSX 详解:React 的核心语法
JSX 详解:React 的核心语法
JSX (JavaScript XML) 是 React 的核心语法扩展,它允许你在 JavaScript 代码中编写类似 HTML 的标记。以下是关于 JSX 的全面解析:
一、JSX 的本质
-
不是字符串也不是 HTML:
- JSX 是 JavaScript 的语法扩展
- 最终会被编译为普通的 JavaScript 函数调用(
React.createElement()
)
-
编译过程示例:
// JSX 写法 const element = <h1 className="title">Hello, world!</h1>;// 编译后的 JavaScript const element = React.createElement('h1',{ className: 'title' },'Hello, world!' );
二、JSX 的核心特性
1. 嵌入表达式
const name = 'Alice';
const element = <h1>Hello, {name}</h1>; // 使用大括号嵌入变量
2. 属性设置
// 常规属性
const element = <div className="container"></div>;// 动态属性
const isActive = true;
const button = <button disabled={!isActive}>Click</button>;
3. 特殊属性名
class
→className
(因为 class 是 JavaScript 保留字)for
→htmlFor
tabindex
→tabIndex
三、JSX 的进阶用法
1. 多行 JSX
const element = (<div><h1>标题</h1><p>段落内容</p></div>
);
2. 条件渲染
{isLoggedIn ? (<LogoutButton />
) : (<LoginButton />
)}
3. 列表渲染
const numbers = [1, 2, 3];
const listItems = numbers.map((number) => <li key={number.toString()}>{number}</li>
);
4. 子元素
// 包含子元素
const element = (<div><h1>标题</h1>{children}</div>
);// 自闭合标签
const img = <img src={user.avatarUrl} />;
四、JSX 的底层原理
-
Babel 转换:
- JSX 通过 Babel 的
@babel/plugin-transform-react-jsx
插件转换 - 可以配置使用不同的运行时(如 React 17+ 的新 JSX 转换)
- JSX 通过 Babel 的
-
React 17+ 的新 JSX 转换:
// 不再需要引入 React function App() {return <h1>Hello World</h1>; }
五、为什么使用 JSX
-
优势:
- 更直观的 UI 表达方式
- 视觉上更接近最终渲染结果
- 提供编译时错误检查
- 防止注入攻击(XSS)
-
对比模板语法:
- 不同于 Vue/Angular 的模板语法
- 完全利用 JavaScript 的表达能力
- 不需要学习额外的模板语法
六、常见问题
1. 必须闭合标签
// 错误
const img = <img src="...">// 正确
const img = <img src="..." />;
2. 返回单个根元素
// 错误
return (<h1>标题</h1><p>内容</p>
);// 正确:使用 Fragment 或 div 包裹
return (<><h1>标题</h1><p>内容</p></>
);
JSX 是 React 开发的核心技能,熟练掌握它能够极大提高 React 开发效率和代码可读性。