组件与 JSX
如何把一段 UI 定义成组件?
- 组件: 描述一块 UI 的可复用函数,返回 React 可以渲染的内容,常见写法是返回 JSX;
- 命名规则: 自定义组件以大写字母开头,使
<Profile />与小写的浏览器标签区分; - 定义位置: 在模块顶层定义组件,不在另一个组件的函数体中定义,否则每次渲染会产生新组件类型并可能重置状态;
function Profile() {
return <img src="photo.png" alt="用户头像" />;
}
export default function Gallery() {
return (
<section>
<Profile />
<Profile />
</section>
);
}
如何让组件在多个文件间复用?
- 默认导出: 一个模块最多一个 default 导出,导入时可自行命名,例如
import Gallery from './Gallery'; - 命名导出: 一个模块可以有多个命名导出,使用花括号按导出名导入,例如
import { Profile } from './Gallery'; - 文件边界: 小型相关组件可以共处一文件,按复用需求和阅读负担拆分,不要求每个组件单独一个文件;
// Gallery.jsx
export function Profile() {
return <img src="/profile.png" alt="用户头像" />;
}
export default function Gallery() {
return (
<section>
<Profile />
</section>
);
}
// App.jsx
import Gallery, { Profile } from "./Gallery";
export default function App() {
return (
<>
<Gallery />
<Profile />
</>
);
}
JSX 如何描述嵌套结构?
- JSX: 在 JavaScript 中描述标记结构的语法扩展,构建工具会将其转换为 JavaScript;它与 React 是不同概念;
- 根表达式: 一段相邻 JSX 标签需要共同父节点,也可用 Fragment 的
<>...</>分组且不增加 DOM; - 换行返回: 多行 JSX 紧跟
return (,避免自动分号插入把返回语句提前结束;
function Intro() {
return (
<>
<h1>React</h1>
<p>用组件组织界面。</p>
</>
);
}
把 HTML 改成 JSX 时需要修正什么?
- 标签闭合: 显式关闭所有标签,包括
<img />、<br />等空元素; - 属性名称: 多数使用 camelCase,例如
className、htmlFor、strokeWidth;aria-*和data-*保留连字符; - 转换工具: 可辅助批量转换,但仍需检查无障碍文本、动态数据和组件边界;