- 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 ===> 子组件 。
-
默认插槽
父组件中:<Category><div>html结构1</div></Category>子组件中:<template><div><!-- 定义插槽 --><slot>插槽默认内容...</slot></div></template>
具名插槽
父组件中:<Category><!-- 默认插槽为default --><div slot="default">插入匿名插槽内容</div><!-- 方式一: slot="" --><template slot="center"><div>html结构1</div></template><!-- 方式二: v-slot: 推荐 因为vue3.x在用在vue3中 v-slot:可以简写为# <template #footer>--><template v-slot:footer><div>html结构2</div></template></Category>子组件中:<template><div><!-- 定义插槽 --><slot>默认插槽内容...</slot><slot name="center">插槽默认内容...</slot><slot name="footer">插槽默认内容...</slot></div></template>
作用域插槽
应用场景: 数据在组件的自身(子组件),但根据数据生成的结构需要组件的使用者(父组件)来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)
写法 :v-slot:scope="scopeData"->v-slot:插槽名="自定义集合名"```vue 父组件中:<Category><template scope="scopeData"><!-- 生成的是ul列表 --><ul><li v-for="g in scopeData.games" :key="g">{{g}}</li></ul></template></Category><Category>
<template slot-scope="scopeData"> <!-- 生成的是h4标题 --> <h4 v-for="g in scopeData.games" :key="g">{{g}}</h4> </template> </Category>
子组件中:
<script>
export default {
name:'Category',
props:['title'],
//数据在子组件自身
data() {
return {
games:['红色警戒','穿越火线','劲舞团','超级玛丽']
}
},
}
</script>
<a name="nyuOR"></a>
## 插槽项目实例
> 共用插槽模板 - Header.vue
```vue
<template>
<!--公用函数给模板-->
<div class="header" @click="changeThemes">
<!--注意点: 不能直接插槽设置样式-->
<div class="left">
<slot name="left">左边</slot>
</div>
<slot name="center">中间</slot>
<div class="right">
<slot name="right">右边</slot>
</div>
</div>
</template>
<script>
export default {
name:"Header",
methods:{
changeThemes(){
}
}
}
</script>
<style scoped lang="scss">
//公用样式
.header{
.left, .right{
*{
}
}
}
</style>
使用插槽的模板 - xx.vue
<template>
<Header class="header">
<div slot="left" class="header-left"></div>
<p slot="center" class="header-title">网抑云音乐</p>
<!--个人函数/样式 自己配置-->
<div slot="right" class="header-right" @click.stop="accountClick"></div>
</Header>
</template>
<script>
import Header from './Header.vue'
export default {
name:"MainHeader",
components:{
Header
},
methods:{
//个人函数自己配置
accountClick(){
this.$router.push('/account')
}
}
}
</script>
<style scoped lang="scss">
.header{
.header-left{
}
.header-right{
}
.header-title{
}
}
</style>
