默认插槽
父组件
<Sidebar><div>{{ strData }}</div></Sidebar>
let strData = ref('我是你爸爸真伟大,养你这么大');//定义插槽数据
子组件
<slot>没有数据,我先默认显示一下 loading。。。。。。。</slot>
父组件提供的内容会覆盖子组件的默认内容。
若父组件未提供具名插槽内容,子组件的默认内容将被渲染。
具名插槽
子组件
<slot name="title"></slot><slot name="strslot">没有数据,我先默认显示一下 loading。。。。。。。</slot>//给插槽取两个名字 title strslot
父组件
<Sidebar><template v-slot:title><span>{{title}}</span></template><template v-slot:strsolt><div>{{ strData }}</div></template></Sidebar>//简写<Sidebar><template #title><span>{{title}}</span></template><template #strslot><div>{{ strData }}</div></template></Sidebar>
let strData = ref('我是你爸爸真伟大,养你这么大');//定义插槽数据
let title = ref('我是slot的标题');
简写:
#header 等价于 v-slot:header。# 缩写只能在 标签上使用,若直接在组件上使用 v-slot,则不能使用缩写。
通过 name 属性指定插槽名称。
将子组件已经取好的插槽名在父组件
使组件结构更灵活,适用于多种场景。
语法:
子组件用 定义,父组件用 <template #xxx> 使用。
作用:
允许父组件将内容精确分发到子组件的不同位置。
适用场景:
布局组件、模态框、表格等需要灵活内容结构的组件。
通过具名插槽,组件可以更灵活地复用,同时保持清晰的结构和数据流向。
作用域插槽
子组件
<slot name="title"></slot><slot name="strslot" :childData="sendData">没有数据,我先默认显示一下 loading。。。。。。。</slot>//script
let sendData = ref('这是儿子给父亲最后的一点温柔了');
父组件
<Sidebar><template #title><div>{{ title }}</div></template><template #strslot="{ childData }"><div>{{ strData }}</div><span>{{ childData }}</span></template></Sidebar>
作用:
允许子组件向父组件传递数据,使父组件能够动态自定义子组件的渲染内容。
突破数据单向流动限制:子组件可向父组件回传数据,父组件基于这些数据自定义渲染逻辑。
增强组件复用性:子组件提供 “渲染接口”,父组件通过插槽自定义具体实现。
数据来源:
子组件向父组件传递动态数据
灵活性:
高(内容可根据子组件数据变化)
语法:
传递数据
<!-- 完整语法 -->
<template v-slot:item="{ item }">...</template><!-- 缩写语法 -->
<template #item="{ item }">...</template>
适用场景:
列表 / 表格组件、通用布局组件、需要动态内容的组件。
默认插槽对比:
普通插槽内容由父组件静态定义,作用域插槽内容动态依赖子组件数据。