组件组合是 React 的核心设计理念,通过组合构建复杂 UI 而非继承。

示例 1: 容器/内容模式

用户信息

张三

前端工程师

操作面板

这是一个带有底部操作栏的卡片组件。

function Card({ children, title, footer }) {
  return (
    <div className="card">
      {title && <header>{title}</header>}
      <div className="content">{children}</div>
      {footer && <footer>{footer}</footer>}
    </div>
  );
}

<Card title="标题" footer={<Button>确认</Button>}>
  <p>内容...</p>
</Card>

示例 2: 特化组件

ℹ️

提示

这是一个通用的 Alert 组件

成功

操作已成功完成!

错误

发生了一个错误,请重试。
// 通用组件
function Alert({ children, type, title }) { ... }

// 特化组件:预设了 type 和 title
function SuccessAlert({ children }) {
  return (
    <Alert type="success" title="成功">
      {children}
    </Alert>
  );
}

function ErrorAlert({ children }) {
  return (
    <Alert type="error" title="错误">
      {children}
    </Alert>
  );
}

示例 3: 插槽模式

Logo

主内容区域

插槽模式允许你在组件的不同位置插入自定义内容。

© 2024 My App
<Layout
  header={<Header />}
  sidebar={<Sidebar />}
  footer={<Footer />}
>
  <MainContent />
</Layout>

示例 4: 复合组件

React

React 是一个用于构建用户界面的 JavaScript 库。

<Tabs defaultTab="react">
  <TabList>
    <Tab value="react">React</Tab>
    <Tab value="vue">Vue</Tab>
  </TabList>
  <TabPanel value="react">React 内容</TabPanel>
  <TabPanel value="vue">Vue 内容</TabPanel>
</Tabs>
复合组件: 多个相关组件共享状态(通过 Context), 提供灵活的 API 同时保持内部逻辑封装。

示例 5: 组合工厂

// 基础 Button 组件
function Button({ variant, size, children, ...props }) { ... }

// 预配置变体
function PrimaryButton(props) {
  return <Button variant="primary" {...props} />;
}

// 组合扩展
function IconButton({ icon, children, ...props }) {
  return (
    <Button {...props}>
      {icon} {children}
    </Button>
  );
}