普通插槽
//子组件 : (假设名为:child)
<template>
<div class='child'>
我在子组件里面
<slot></slot>
<slot name="one"></slot>
</div>
</template>
//父组件:(引用子组件 child)
<template>
<div class= 'app'>
<child>
这是插入到默认插槽的内容 {{parent}}
<template v-slot:"one"> 这是插入到one插槽的内容 {{parent}}</template>
</child>
</div>
</template>
new Vue({
el:'.app',
data:{
parent:'父组件的值'
}
})
{
tag: "div",
children: [{
tag: "child",
children: ['这是插入到默认插槽的内容 父组件的值',
'这是插入到one插槽的内容 父组件的值']
}]
}
{
tag: "div",
children: [
'我在子组件里面',
_t('default'), // 匿名插槽,默认名称为default
_t('one') // 具名插槽,名称为one
]
}
{
tag: "div",
children: ['我在子组件里面',
'这是插入到默认插槽的内容 父组件的值',
'这是插入到one插槽的内容 父组件的值']
}
作用域插槽
//子组件 : (假设名为:child)
<template>
<div class= 'child'>
我在子组件里面
<slot :value1='child1' :value2='child1'></slot>
<slot name='one' :value1='child2' :value2='child2'></slot>
</div>
</template>
new Vue({
el:'child',
data:{
child1: '子数据1',
child2: '子数据2'
}
})
//父组件:(引用子组件 child)
<template>
<div class='app'>
<child>
<template v-slot:default='slotde'>
插入默认 slot 中{{ slotde.value1 }}{{ slotde.value2 }}
</template>
<template v-slot:one='slotone'>
插入one slot 中{{ slotone.value1 }}{{ slotone.value2 }}
</template>
</child>
</div>
</template>
{
tag: "div",
children: [{
tag: "child"
scopeSlots:{
default (data) { // 记住这个data参数
return ['插入one slot 中插入默认 slot 中' + data.value1 + data.value2]
},
one (data) { // 记住这个data参数
return ['插入one slot 中' + data.value1 + data.value2]
}
}
}]
}
{
tag: "div",
children: [
'我在子组件里面',
_t('default',{value1: '子数据1', value2: '子数据1'}),
_t('one',{value1: '子数据2', value2: '子数据2'})
]
}
解析成
{
tag: "div",
children: [
'我在子组件里面',
'插入默认 slot 中 子数据1 子数据1',
'插入one slot 中 子数据2 子数据2'
]
}
解析后的vnode存储在$slots内
//子组件 : (假设名为:child)
<template>
<div class= 'child'>
<slot></slot>
<slot name='one'></slot>
<slot name='two'></slot>
<slot name='three'></slot>
</div>
</template>
new Vue({
el:'.child',
created () {
console.log(this.$slots) // 存放插槽解析后的虚拟vnode
}
})