在 Vue 3 中使用 TSX 编写组件时,slots
的写法与 Vue 2 有所不同。Vue 3 的 TSX 支持通过 slots
属性或 v-slots
指令来传递插槽内容。以下是详细的写法说明:
1. 默认插槽
默认插槽可以通过 slots.default
来传递内容。
示例:
import { defineComponent } from 'vue';
const ChildComponent = defineComponent({
render() {
return <div>{this.$slots.default?.()}</div>;
},
});
const ParentComponent = defineComponent({
render() {
return (
<ChildComponent>
{{
default: () => <span>This is the default slot content</span>,
}}
</ChildComponent>
);
},
});
export default ParentComponent;
2. 具名插槽
具名插槽可以通过 slots.slotName
来传递内容。
示例:
import { defineComponent } from 'vue';
const ChildComponent = defineComponent({
render() {
return (
<div>
<header>{this.$slots.header?.()}</header>
<main>{this.$slots.default?.()}</main>
<footer>{this.$slots.footer?.()}</footer>
</div>
);
},
});
const ParentComponent = defineComponent({
render() {
return (
<ChildComponent>
{{
header: () => <h1>This is the header slot</h1>,
default: () => <p>This is the default slot content</p>,
footer: () => <p>This is the footer slot</p>,
}}
</ChildComponent>
);
},
});
export default ParentComponent;
3. 作用域插槽
作用域插槽可以通过 slots.slotName
传递一个函数,函数的参数是子组件传递的数据。
示例:
import { defineComponent } from 'vue';
const ChildComponent = defineComponent({
setup() {
const user = { name: 'Alice', age: 25 };
return { user };
},
render() {
return (
<div>
{this.$slots.default?.({ user: this.user })}
</div>
);
},
});
const ParentComponent = defineComponent({
render() {
return (
<ChildComponent>
{{
default: ({ user }: { user: { name: string; age: number } }) => (
<p>
User: {user.name}, Age: {user.age}
</p>
),
}}
</ChildComponent>
);
},
});
export default ParentComponent;
4. 使用 v-slots
指令
Vue 3 提供了 v-slots
指令,可以更简洁地传递插槽内容。
示例:
import { defineComponent } from 'vue';
const ChildComponent = defineComponent({
render() {
return (
<div>
<header>{this.$slots.header?.()}</header>
<main>{this.$slots.default?.()}</main>
</div>
);
},
});
const ParentComponent = defineComponent({
render() {
return (
<ChildComponent
v-slots={{
header: () => <h1>This is the header slot</h1>,
default: () => <p>This is the default slot content</p>,
}}
/>
);
},
});
export default ParentComponent;
5. 插槽的简写形式
如果只有一个默认插槽,可以直接传递内容,而不需要使用 slots
属性。
示例:
import { defineComponent } from 'vue';
const ChildComponent = defineComponent({
render() {
return <div>{this.$slots.default?.()}</div>;
},
});
const ParentComponent = defineComponent({
render() {
return (
<ChildComponent>
<p>This is the default slot content</p>
</ChildComponent>
);
},
});
export default ParentComponent;
6. 总结
- 默认插槽:使用
slots.default
或直接传递内容。 - 具名插槽:使用
slots.slotName
或v-slots
指令。 - 作用域插槽:通过函数参数接收子组件传递的数据。
v-slots
指令:提供了一种更简洁的插槽传递方式。
通过以上方式,你可以在 Vue 3 的 TSX 中灵活使用插槽功能。
前端工程师、程序员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~