joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

React 中模拟实现 Slot 插槽功能的示例教程

在 React 中虽然没有原生的 slot 语法(如 Vue 或 Web Components),但可以通过 props.children 或命名插槽的方式来模拟类似功能。本文将基于两个组件文件详细讲解一个使用“插槽”模式的完整示例。


📁 文件结构

src/
└── pages/
    └── MytestA/
        ├── index.tsx
        └── components/
            └── SlotTest.tsx
  • index.tsx: 主页面组件,用于调用插槽组件并传递内容。
  • SlotTest.tsx: 插槽组件定义,用于接收和渲染插槽内容。

🧱 SlotTest.tsx:定义插槽组件

定义 Props 接口

interface SlotTestProps {
  header?: React.ReactNode;
  default?: React.ReactNode;
  footer?: React.ReactNode;
}

创建组件函数

const SlotTest: React.FC<SlotTestProps> = ({
  header,
  default: defaultContent,
  footer,
}) => {
  return (
    <div style={{ border: "1px solid #ccc", padding: "16px" }}>
      <div className="header">{header || <p>Default Header</p>}</div>
      <div className="content">{defaultContent || <p>Default Content</p>}</div>
      <div className="footer">{footer || <p>Default Footer</p>}</div>
    </div>
  );
};
  • 使用 React.FC<SlotTestProps> 类型定义了可选的插槽 props。
  • 每个插槽都提供了默认内容作为 fallback。
  • 使用不同的 div 区域渲染对应的插槽内容。

🧩 index.tsx:使用插槽组件

引入插槽组件

import SlotTest from "./components/SlotTest";

在父组件中使用插槽组件

<SlotTest
  header={<h3>自定义头部</h3>}
  default={<p>这是主体内容区域</p>}
  footer={<button>提交按钮</button>}
/>

✅ 总结

本示例展示了如何在 React 中模拟实现类似 Web Components 和 Vue 的插槽机制:

  • SlotTest.tsx 定义了一个可接受三个插槽区域(header、default、footer)的组件。
  • index.tsx 演示了如何在父组件中向 [SlotTest](file://f:\my_code_2024\react-template-admin-main\src\pages\MytestA\components\SlotTest.tsx#L8-L20) 传递插槽内容。
  • 插槽内容通过 props 传递,并且可以提供默认值作为 fallback。

这种实现方式非常适合构建可复用的 UI 组件库,允许开发者灵活地插入自定义内容到指定位置,从而提高组件的灵活性和可定制性。


📌 小贴士

  • 如果你只需要一个默认插槽,可以直接使用 [children](file://f:\my_code_2024\react-template-admin-main\src\pages\FormPage\index.tsx#L21-L21) 属性来简化代码。
  • 对于更复杂的插槽场景,可以使用第三方库如 react-slot 来进一步封装插槽逻辑。
  • 插槽机制可以帮助你构建更具表现力和可组合性的 UI 组件。

posted on 2025-05-17 16:57  joken1310  阅读(209)  评论(0)    收藏  举报