当前位置:首页 > React

react如何使用插槽

2026-02-26 16:05:03React

使用 props.children 实现基础插槽

在 React 中,插槽的核心是通过 props.children 传递子组件。父组件可以通过嵌套子元素的方式将内容传递给子组件,子组件通过 props.children 接收并渲染。

父组件示例:

<ParentComponent>
  <div>这是插槽内容</div>
</ParentComponent>

子组件示例:

function ParentComponent(props) {
  return <div>{props.children}</div>;
}

命名插槽(通过 props 传递)

如果需要多个插槽(类似 Vue 的具名插槽),可以通过传递特定 props 实现。父组件将不同内容分配到不同的 props,子组件按需渲染。

父组件示例:

react如何使用插槽

<Modal
  header={<h1>标题</h1>}
  body={<p>正文内容</p>}
  footer={<button>关闭</button>}
/>

子组件示例:

function Modal(props) {
  return (
    <div>
      <div className="header">{props.header}</div>
      <div className="body">{props.body}</div>
      <div className="footer">{props.footer}</div>
    </div>
  );
}

使用 React.cloneElement 动态控制插槽

通过 React.cloneElement 可以向插槽内容注入额外的 props 或修改行为。适用于需要动态控制子组件的场景。

示例:

react如何使用插槽

function Tabs(props) {
  const [activeIndex, setActiveIndex] = useState(0);
  return (
    <div>
      {React.Children.map(props.children, (child, index) =>
        React.cloneElement(child, {
          isActive: index === activeIndex,
          onClick: () => setActiveIndex(index),
        })
      )}
    </div>
  );
}

使用 Context 跨层级传递插槽内容

对于深层嵌套的组件,可以通过 Context 共享插槽内容,避免逐层传递 props

示例:

const SlotContext = React.createContext();

function Layout() {
  return (
    <SlotContext.Provider value={{ header: <Header />, footer: <Footer /> }}>
      <Page />
    </SlotContext.Provider>
  );
}

function Page() {
  const { header, footer } = useContext(SlotContext);
  return (
    <div>
      {header}
      <main>页面内容</main>
      {footer}
    </div>
  );
}

使用 render props 实现灵活插槽

通过函数类型的 props,父组件可以动态决定插槽内容的渲染逻辑。

示例:

function DataFetcher({ render }) {
  const [data, setData] = useState(null);
  useEffect(() => {
    fetchData().then(setData);
  }, []);

  return <div>{render(data)}</div>;
}

// 使用方式
<DataFetcher render={(data) => (data ? <p>{data}</p> : <p>加载中...</p>)} />

注意事项

  • props.children 可以是任意类型(字符串、数组、组件等),需处理边界情况(如 null)。
  • 命名插槽更适合复杂布局,但需避免过度设计。
  • Context 适用于全局共享插槽,但可能增加组件耦合性。
  • render props 适合逻辑复用,但嵌套过深会影响可读性。

分享给朋友:

相关文章

uniapp中如何使用iconfont

uniapp中如何使用iconfont

使用 Iconfont 在 Uniapp 中的步骤 下载 Iconfont 资源 访问 Iconfont 官网,选择需要的图标并添加到项目。下载时选择 Font class 格式,解压后会得到 .tt…

uniapp插槽异常

uniapp插槽异常

uniapp插槽异常常见原因及解决方法 插槽在uniapp开发中常用于组件间内容分发,异常可能由以下原因导致: 作用域插槽未正确声明 插槽作用域变量需在父组件和子组件间明确传递。子组件需定义v-s…

react如何使用webview

react如何使用webview

使用 React 实现 WebView 的方法 在 React 中,可以通过不同的方式实现 WebView 功能,具体取决于开发环境(如 React Native 或 Web 应用)。以下是常见的实现…

uniapp 插槽使用

uniapp 插槽使用

uniapp 插槽的基本使用 插槽(Slot)是组件化开发中的重要特性,允许在组件内部预留位置,由父组件动态传入内容。uniapp 支持 Vue 的插槽语法,包括默认插槽、具名插槽和作用域插槽。 默…

react filter如何使用

react filter如何使用

react filter 的基本用法 在 React 中,filter 通常用于筛选数组数据,常见于列表渲染或数据处理场景。filter 是 JavaScript 数组的原生方法,但在 React 中…

react如何使用axios

react如何使用axios

安装 Axios 在 React 项目中安装 Axios,可以通过 npm 或 yarn 进行安装: npm install axios 或 yarn add axios 导入 Axios 在需要…