什么是JSX?
JSX(JavaScript XML)是React推出的语法扩展,允许我们在JavaScript代码中直接编写HTML结构。用简单的话说: "JS in XML" ------这就像在JavaScript中嵌入HTML,让UI结构更直观。
jsx
// JSX写法(直观易懂)
const element = <h1 className='title'>Hello React</h1>
// 等价的原生JS写法(繁琐冗长)
const element2 = createElement('h1',{className:'title',id:'tit'},'Hello JSX')
划重点 :JSX 不能直接运行 ,需要通过Babel编译成 React.createElement()
调用才能被浏览器识别
JSX基础语法规则
1. className替代class
HTML中的 class 属性在JSX中必须写成 className (因为class是JavaScript关键字):
jsx
// 错误 ❌
<div class="container"></div>
// 正确 ✅
<div className="container"></div>
2. 大括号{}嵌入表达式
用 {} 包裹JavaScript表达式(变量、函数调用、三元运算等):
jsx
<ul>
{todos.map((todo)=>(
<li key={todo.id}>{todo.title}</li>
))}
</ul>
3. 单根节点要求
JSX表达式必须有且仅有一个根节点,推荐使用空标签 <>
或 <React.Fragment>
:
jsx
// 正确写法
return (
<>
<h1>标题</h1>
<p>内容</p>
</>
)
列表渲染与key的核心考点
为什么需要key?
React通过key识别列表项的身份,从而高效更新DOM。没有key或key不稳定会导致:
- 性能下降(频繁重排重绘)
- 状态错乱(尤其是输入框等受控组件)
readme.md
正确使用key的3个原则
- 唯一性 :同列表中key不能重复
- 稳定性 :key不应随渲染变化(避免用index)
- 不可变性 :key应与数据绑定而非动态生成
jsx
// 推荐 ✅ 使用数据唯一ID作为key
{todos.map((todo)=>(
<li key={todo.id}>
{todo.title}
</li>
))}
// 危险 ❌ 不要用index作为key(尤其列表会排序/增删时)
{todos.map((todo, index)=>(
<li key={index}>
{todo.title}
</li>
))}
反例演示:用index作为key的坑
当我们在列表 头部插入新元素 时:
jsx
// 原列表
[{id:1, title:'标题一'}, {id:2, title:'标题二'}]
// 用index作为key时DOM结构
<li key={0}>标题一</li>
<li key={1}>标题二</li>
// 插入新元素后
[{id:3, title:'新标题'}, {id:1, title:'标题一'}, {id:2, title:'标题二'}]
// key发生错位,导致React误判所有元素都变了
<li key={0}>新标题</li>
<li key={1}>标题一</li>
<li key={2}>标题二</li>
JSX性能优化技巧
1. 避免不必要的嵌套
jsx
// 优化前
return (
<div>
<MyComponent />
</div>
)
// 优化后(减少一层DOM节点)
return <MyComponent />
2. 提取重复JSX片段为组件
jsx
// 重复代码
{todos.map(todo => (
<li key={todo.id}>
<span className="title">{todo.title}</span>
<button onClick={() => deleteTodo(todo.id)}>删除</button>
</li>
))}
// 优化:提取为TodoItem组件
{todos.map(todo => (
<TodoItem key={todo.id} todo={todo} onDelete={deleteTodo} />
))}
高频面试题解析
Q1: JSX和HTML的区别?
A:
- 属性名不同:className vs class, htmlFor vs for
- JSX可嵌入表达式({})
- JSX需要单根节点
- JSX支持自闭和标签( )
Q2: 为什么JSX中不能用if语句?
A: JSX本质是表达式,而if是语句不是表达式。解决方案:
jsx
// 方案1:三元运算
{isLogin ? <User /> : <Login />}
// 方案2:逻辑与
{isLogin && <User />}
// 方案3:外部定义变量
const content = isLogin ? <User /> : <Login />
return <div>{content}</div>
Q3: JSX的编译过程是怎样的?
A: JSX → Babel编译 → React.createElement() → 虚拟DOM对象 → 真实DOM
jsx
// JSX
<div className="box">Hello</div>
// 编译后
React.createElement(
'div',
{className: 'box'},
'Hello'
)
总结
JSX作为React的核心特性,既是面试高频考点,也是日常开发的基础。掌握它需要理解:
- 语法规则 :className、{}表达式、单根节点
- 列表渲染 :key的作用与正确用法
- 编译原理 :JSX→createElement的转换过程
- 性能优化 :避免不必要渲染和DOM嵌套
记住:JSX不只是"在JS里写HTML",而是React组件化思想的直观体现------用声明式代码描述UI,让我们专注于业务逻辑而非DOM操作。