组件基础

组件是 React 的核心概念之一。它们让你可以将 UI 拆分为独立、可复用的部分, 并单独考虑每个部分。

定义组件

传统上,组件被定义为 JavaScript 类。然而,随着 React Hooks 的引入, 函数组件成为了更简单和更强大的方式。

函数组件

这就是一个函数组件:

TypeScript
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

这个函数是一个有效的 React 组件,因为它接收唯一带有数据的 “Props”(属性)对象 并返回一个 React 元素。这类组件被称为函数组件,因为它们字面上就是 JavaScript 函数。

导入和导出组件

你可以在一个文件中声明多个组件,但文件会变得很拥挤。 因此,通常会将每个组件声明在各自的文件中。

导出组件

TypeScript
// Button.js
export default function Button() {
  return (
    <button>
      点击我
    </button>
  );
}

导入组件

TypeScript
// App.js
import Button from './Button.js';

export default function App() {
  return (
    <div>
      <Button />
    </div>
  );
}
提示

使用默认导出(export default)可以让你使用更短的导入语法。 但你也可以使用命名导出(export),如果你需要从一个文件导出多个组件。

JSX 语法规则

JSX 是 JavaScript 的语法扩展,让你可以在 JavaScript 文件中编写类似 HTML 的标记。 它在 React 中被广泛使用。

1

返回单个根元素

组件必须返回一个单一的根元素。这个根元素可以有多个子元素。

TypeScript
// ✅ 正确
return (
  <div>
    <h1>标题</h1>
    <p>段落</p>
  </div>
);

// ❌ 错误
return (
  <h1>标题</h1>
  <p>段落</p>
);

如果你不想在 DOM 中添加额外的 <div>, 可以使用 Fragment(<>):

TypeScript
return (
  <>
    <h1>标题</h1>
    <p>段落</p>
  </>
);
2

关闭所有标签

在 JSX 中,每个标签都必须关闭。自闭合标签需要以 /> 结尾。

TypeScript
// ✅ 正确
<img src="avatar.jpg" alt="头像" />

// ❌ 错误
<img src="avatar.jpg" alt="头像">
3

使用 camelCase 命名

大多数 React 属性使用 camelCase 命名,而不是 HTML 的 kebab-case。

TypeScript
// HTML
<input class="input-field" />

// JSX
<input className="input-field" />

下一步

现在你已经了解了组件的基础知识,接下来可以学习: