通过对象 Props 实现命名插槽
通过命名 props 传递 JSX,实现页眉、主体和页脚插槽。
通过对象 Props 实现命名插槽 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
欢迎
在本课中,您将通过命名属性传递 JSX,实现灵活的命名插槽,从而构建包含页眉、正文和页脚区域的布局组件,而不受固定子元素结构的限制。
子元素属性的局限性
单个 `children` 属性适用于一个内容区域。当组件需要多个彼此独立的内容区域时(例如包含页眉和页脚的卡片),使用携带 JSX 的命名属性是简洁的解决方案。
命名属性插槽
在组件的接口中为每个插槽定义一个属性。父组件将 JSX 传给每个属性,组件则在正确的位置渲染每个插槽。
function Card({ header, body, footer }) {
return (
<div className="card">
<div className="card-header">{header}</div>
<div className="card-body">{body}</div>
<div className="card-footer">{footer}</div>
</div>
);
}
// Usage
<Card
header={<h2>Title</h2>}
body={<p>Content here</p>}
footer={<button>OK</button>}
/>可选插槽
只有在属性为真值时才渲染插槽,就可以让插槽变为可选。这样,同一个组件就可以在有页脚或没有页脚的情况下使用。
function Card({ header, children, footer }) {
return (
<div>
{header && <div className="header">{header}</div>}
<div className="body">{children}</div>
{footer && <div className="footer">{footer}</div>}
</div>
);
}混用子元素与命名插槽
使用 `children` 表示主要内容区域,使用命名属性表示次要区域。这遵循了一个原则:最常见的使用场景应当最便于使用。
<Dialog
title="Confirm"
actions={<><button>Cancel</button><button>OK</button></>}
>
<p>Are you sure?</p> {/* children = primary slot */}
</Dialog>TypeScript:为命名插槽设置类型
将命名插槽属性设置为 `React.ReactNode` 类型,以接受任意 JSX 内容。
interface CardProps {
header?: React.ReactNode;
children: React.ReactNode;
footer?: React.ReactNode;
}命名插槽与复合组件
命名属性简单且明确。复合组件(例如 ``)对于复杂的组件系列来说使用起来更加方便,但需要借助上下文进行更多设置。请先使用命名属性,必要时再迁移。
将组件作为插槽传递
您也可以将插槽设置为 React 组件类型,而不是 JSX。父组件传入组件引用,布局组件负责渲染它。这样,布局组件就可以控制插槽的渲染时机以及渲染次数。
function Timeline({ renderItem, items }) {
return (
<ul>
{items.map(item => (
<li key={item.id}>{renderItem(item)}</li>
))}
</ul>
);
}
<Timeline
items={data}
renderItem={item => <EventCard event={item} />}
/>使用命名插槽组合布局
页面布局组件会广泛使用命名插槽。带有 `sidebar`、`toolbar` 和 `content` 插槽的页面外壳组件,可以让不同页面使用完全不同的各区域内容来组合相同的外壳。
记录命名插槽
命名插槽可以通过 TypeScript 接口或 PropTypes 实现自我说明。使用方可以准确看到哪些插槽可用、哪些是可选的,从而减少对外部文档的需求。
快速检查
对于接受任意 JSX 的命名插槽属性,应使用哪种 TypeScript 类型?
回顾
命名插槽属性让布局组件更加灵活,并且能够自我说明。主要区域使用 children,次要区域使用命名属性,并将它们设置为 React.ReactNode 类型。
接下来
下一课:**使用 cloneElement 克隆并注入属性**——您将使用 React.cloneElement,将隐藏属性从父组件传递给子元素。
常见问题解答
「通过对象 Props 实现命名插槽」课时是免费的吗?
是的 — 「通过对象 Props 实现命名插槽」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「通过对象 Props 实现命名插槽」这节课中我会学到什么?
通过命名 props 传递 JSX,实现页眉、主体和页脚插槽。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「通过对象 Props 实现命名插槽」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- props.children 基础
- React.Children 工具
- 通过对象 Props 实现命名插槽
- 使用 cloneElement 克隆并注入 Props