父组件可以在html的子组件元素中间插入html 字符串 组件,这些东西都会被插入到子组件的
插槽内容
slot-child
父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的
插槽内可以访问与模板其余部分相同的实例 property (即相同的“作用域”),不能访问子组件的实列property
子组件可以在slot标签加入备用内容。当父组件模板提供插槽内容,将渲染提供的插槽内容。如果没有,则会渲染slot标签之间的备用内容
备用内容
有时我们需要多个插槽,对于这样的情况,
template v-slot:name包含的内容会替换有相同的的name的slot的位置
一个不带 name 的
defalut{{ msg }}
one{{ msg }}
two{{ msg }}
1
2
3
通过在slot绑定属性,父组件可以访问到这些子组件数据,多个插槽时注意name要一致
one{{ msg }}
{{ slotProps.item }}{{ slotProps.str }}
只有一个插槽时,上面是下面一种的缩写,:default可以省略
不过,只要出现多个插槽,请始终为所有的插槽使用完整的基于 的语法
{{ slotProps.item }}{{ slotProps.str }}
{{ slotProps.item }}{{ slotProps.str }}
作用域插槽的内部工作原理是将你的插槽内容包括在一个传入单个参数的函数里
function (slotProps) {
// ... 插槽内容 ...
}
这意味着和函数入参的解构的操作都可以做
解构 {str} = slotProps
解构重命名 {str: str2} = slotProps
解构定义备用内容 {str = '备用内容'} = slotProps,注意这是str属性为undefined的时候(显式声明str:undefined或者
two{{ msg }}
{{ str }}
以下等同于
data() {
return {
oneName: "one",
};
},
跟 v-on 和 v-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。
例如 v-slot:header 可以被重写为 #header:
然而,和其它指令一样,该缩写只在其有参数的时候才可用,如#="{ item }"是无效的
必须始终以明确插槽名取而代之, #default="{ item }"
动态插槽名也可以缩写: