1. JSX/TSX 核心概念解析
1.1 什么是 JSX
JSX(JavaScript XML)是 JavaScript 的语法扩展,它允许开发者在 JavaScript 代码中直接编写类似 HTML 的标记语言。这种语法最初由 React 团队提出,现已成为 React 生态中的标准写法。
技术细节:JSX 本质上是一种语法糖,在编译阶段会被转换为普通的 JavaScript 函数调用。例如
<div>Hello</div>会被编译为React.createElement('div', null, 'Hello')。
在实际开发中,JSX 提供了以下核心优势:
- 更直观的 UI 描述方式,所见即所得
- 更好的代码可读性和维护性
- 完整的 JavaScript 表达能力(通过
{}嵌入表达式) - 编译时的语法检查
1.2 TSX 的增强特性
TSX 是 JSX 的 TypeScript 版本,它在保留 JSX 所有特性的基础上,增加了类型系统的支持:
- 类型检查:对组件 props、state 等进行静态类型检查
- 智能提示:开发时获得更准确的代码补全
- 重构安全:重命名、修改组件时更安全
- 文档化:类型定义本身就是一种代码文档
文件扩展名约定:
.jsx用于 JavaScript + JSX.tsx用于 TypeScript + JSX
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础语法深度剖析
2.1 元素创建与属性绑定
JSX 元素的基本语法与 HTML 类似,但有几个关键区别需要注意:
jsx复制// 自闭合标签必须闭合
const img = <img src="logo.png" alt="Logo" />;
// 属性使用驼峰命名(camelCase)
const input = <input tabIndex={1} />;
// 动态属性绑定
const dynamicId = 'main-content';
const div = <div id={dynamicId}>内容</div>;
特殊属性处理:
className替代classhtmlFor替代forstyle接受对象而非字符串
2.2 JavaScript 表达式嵌入
JSX 通过 {} 提供了强大的 JavaScript 表达式嵌入能力:
jsx复制// 变量引用
const user = { name: '张三' };
const greeting = <h1>你好, {user.name}!</h1>;
// 函数调用
function formatDate(date) {
return date.toLocaleDateString();
}
const dateDisplay = <span>{formatDate(new Date())}</span>;
// 复杂表达式
const score = 85;
const result = (
<div>
你的成绩是:{score}({score >= 60 ? '及格' : '不及格'})
</div>
);
注意事项:
- 不能直接使用语句(如 if/for),只能使用表达式
- 对象直接量需要额外处理(如
{...obj}或JSON.stringify(obj)) - 避免在 JSX 中编写过于复杂的逻辑
3. 样式处理方案对比
3.1 内联样式实践
JSX 中的内联样式与传统 HTML 有显著不同:
jsx复制const divStyle = {
// 属性名使用驼峰命名
backgroundColor: '#f5f5f5',
// 像素值可以省略单位(自动添加px)
padding: 16,
// 需要单位时必须使用字符串
width: '100%',
// 厂商前缀自动处理
userSelect: 'none'
};
const StyledDiv = () => <div style={divStyle}>内容</div>;
优势:
- 样式与组件紧密耦合
- 动态样式处理方便
- 避免全局样式污染
局限:
- 无法使用伪类(:hover)和媒体查询
- 样式复用性较差
- 性能不如静态 CSS
3.2 CSS 模块化方案
更专业的样式处理方式:
jsx复制// Button.module.css
.primary {
background: #1890ff;
color: white;
}
// Button.tsx
import styles from './Button.module.css';
const Button = () => (
<button className={styles.primary}>
主要按钮
</button>
);
这种方案的特点:
- 自动生成唯一类名避免冲突
- 完整的 CSS 功能支持
- 良好的代码组织和复用
- 与构建工具深度集成
4. 列表渲染与性能优化
4.1 高效列表渲染模式
jsx复制const products = [
{ id: 1, name: '手机', price: 3999 },
{ id: 2, name: '笔记本', price: 6999 }
];
function ProductList() {
return (
<ul>
{products.map(product => (
<ProductItem
key={product.id}
product={product}
/>
))}
</ul>
);
}
// 提取为独立组件优化性能
const ProductItem = React.memo(({ product }) => (
<li>
<h3>{product.name}</h3>
<p>价格:¥{product.price}</p>
</li>
));
4.2 Key 的选择策略
Key 是 React 识别元素的重要依据,选择不当会导致性能问题和 UI 错误:
jsx复制// ✅ 推荐:唯一稳定的ID
{todos.map(todo => (
<TodoItem key={todo.id} todo={todo} />
))}
// ⚠️ 谨慎使用:数组索引(仅适用于静态列表)
{fruits.map((fruit, index) => (
<FruitItem key={index} fruit={fruit} />
))}
// ❌ 避免:随机数(每次渲染都会重新创建DOM)
{items.map(item => (
<Item key={Math.random()} item={item} />
))}
5. 条件渲染模式对比
5.1 多种条件渲染方式
jsx复制// 1. if-else 语句
function Greeting({ user }) {
if (user) {
return <h1>欢迎回来, {user.name}!</h1>;
}
return <h1>请登录</h1>;
}
// 2. 三元运算符
const Notification = ({ count }) => (
<div>
{count > 0 ? `你有${count}条消息` : '没有新消息'}
</div>
);
// 3. 逻辑与运算符
const Dashboard = ({ alerts }) => (
<div>
{alerts.length > 0 && (
<AlertBox alerts={alerts} />
)}
</div>
);
// 4. 立即执行函数
const ComplexCondition = ({ status }) => (
<div>
{(() => {
switch(status) {
case 'loading': return <Spinner />;
case 'error': return <Error />;
default: return <Content />;
}
})()}
</div>
);
5.2 条件渲染性能考量
jsx复制// ❌ 不推荐:可能导致不必要的组件挂载/卸载
{show && <HeavyComponent />}
// ✅ 推荐:保持DOM稳定
<HeavyComponent style={{ display: show ? 'block' : 'none' }} />
// 复杂场景使用组件组合
function App() {
return (
<Layout>
<Sidebar />
{route === '/home' && <Home />}
{route === '/profile' && <Profile />}
</Layout>
);
}
6. 事件处理进阶技巧
6.1 性能优化实践
jsx复制// ❌ 避免:内联箭头函数(每次渲染都创建新函数)
<button onClick={() => handleClick(id)}>删除</button>
// ✅ 推荐:提前绑定
<button onClick={handleClick.bind(null, id)}>删除</button>
// 更优方案:使用数据属性
<button data-id={id} onClick={handleClick}>删除</button>
function handleClick(e) {
const id = e.currentTarget.dataset.id;
// 处理逻辑
}
6.2 合成事件系统
React 的事件处理与原生 DOM 事件有所不同:
jsx复制function Form() {
// 事件对象是合成事件(SyntheticEvent)
const handleSubmit = (e) => {
e.preventDefault(); // 阻止默认行为
e.stopPropagation(); // 阻止冒泡
// 原生事件可以通过nativeEvent访问
console.log(e.nativeEvent);
};
return (
<form onSubmit={handleSubmit}>
<input name="username" />
<button type="submit">提交</button>
</form>
);
}
7. 组件设计模式
7.1 容器与展示组件分离
tsx复制// Container Component (逻辑处理)
function UserList
