Vue插槽---默认插槽、具名插槽、作用域插槽
目录
总结
1.默认插槽
2.具名插槽
3.作用域插槽
一、不使用插槽的效果
App.vue
Category.vue
二、默认插槽
App.vue
Category.vue
三、具名插槽
App.vue
Category.vue
四、作用域插槽
App.vue
Category.vue
总结
作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于父组件===》子组件
分类:默认插槽、具名插槽、作用域插槽
使用:
1.默认插槽
2.具名插槽
3.作用域插槽
作用域插槽也可以有名字
理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定
一、不使用插槽的效果
App.vue
<template>
<div class="container">
<Category title="美食" :listData="foods" ></Category>
<Category title="游戏" :listData="games"></Category>
<Category title="电影" :listData="films"></Category>
</div>
</template>
<script>
import Category from './components/Category.vue';
export default{
name:"App",
data(){
return{
foods:['火锅','烧烤','小龙虾','牛排'],
games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
films:['《教父》','《拆弹专家》','《你好,李焕英》']
}
},
components: {
Category
}
}
</script>
<style lang="css">
.container{
/* 弹性布局 */
display: flex;
/* */
justify-content: space-around;
}
</style>
Category.vue
<template>
<div class="category">
<h3>{
{title}}分类</h3>
<ul>
<li v-for="(item,index) in listData" :key="index">{
{item}}</li>
</ul>
</div>
</template>
<script>
export default{
name:'Category',
props:['listData','title']
}
</script>
<style scoped>
.category{
background-color:skyblue ;
width:200px;
height:300px;
}
h3{
text-align:center;
background-color: orange;
}
</style>
二、默认插槽
App.vue
<template>
<div class="container">
<Category title="美食" >
<img src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="">
</Category>
<Category title="游戏" >
<ul>
<li v-for="(g,index) in games" :key="index">{
{g}}</li>
</ul>
</Category>
<Category title="电影">
<!-- controls 就可以播放了 -->
<video controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
</Category>
</div>
</template>
<script>
import Category from './components/Category.vue';
export default{
name:"App",
data(){
return{
foods:['火锅','烧烤','小龙虾','牛排'],
games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
films:['《教父》','《拆弹专家》','《你好,李焕英》']
}
},
components: {
Category
}
}
</script>
<style lang="css">
.container{
/* 弹性布局 */
display: flex;
/* */
justify-content: space-around;
}
</style>
#
Category.vue
<template>
<div class="category">
<h3>{
{title}}分类</h3>
<!-- 插槽 挖个坑,等着别人来这里 -->
<slot>我是默认值,当使用者没有传递具体结构时,我会出现</slot>
</div>
</template>
<script>
export default{
name:'Category',
props:['title']
}
</script>
<style scoped>
video{
width: 100%;
}
img{
width: 100%;
}
.category{
background-color:skyblue ;
width:200px;
height:300px;
}
h3{
text-align:center;
background-color: orange;
}
</style>
三、具名插槽
App.vue
<template>
<div class="container">
<Category title="美食" >
<img slot="center" src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="">
<a slot="footer" href="http://www.atguigu.com">更多美食</a>
</Category>
<Category title="游戏" >
<ul slot="center">
<li v-for="(g,index) in games" :key="index">{
{g}}</li>
</ul>
<div class="foot" slot="footer">
<a href="http://www.atguigu.com">单机游戏</a>
<a href="http://www.atguigu.com">网络游戏</a>
</div>
</Category>
<Category title="电影">
<!-- controls 就可以播放了 -->
<video slot="center" controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
<div class="foot" slot="footer">
<a href="http://www.atguigu.com">经典</a>
<a href="http://www.atguigu.com">热门</a>
<a href="http://www.atguigu.com">推荐</a>
</div>
</Category>
</div>
</template>
<script>
import Category from './components/Category.vue';
export default{
name:"App",
data(){
return{
foods:['火锅','烧烤','小龙虾','牛排'],
games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
films:['《教父》','《拆弹专家》','《你好,李焕英》']
}
},
components: {
Category
}
}
</script>
<style lang="css">
.container,.foot{
/* 弹性布局 */
display: flex;
/* */
justify-content: space-around;
}
</style>
#
Category.vue
<template>
<div class="category">
<h3>{
{title}}分类</h3>
<!-- 插槽 挖个坑,等着别人来这里 -->
<slot name="center">我是默认值,当使用者没有传递具体结构时,我会出现</slot>
<slot name="footer">我是默认值,当使用者没有传递具体结构时,我会出现</slot>
</div>
</template>
<script>
export default{
name:'Category',
props:['title']
}
</script>
<style scoped>
video{
width: 100%;
}
img{
width: 100%;
}
.category{
background-color:skyblue ;
width:200px;
height:300px;
}
h3{
text-align:center;
background-color: orange;
}
</style>
四、作用域插槽
App.vue
<template>
<div class="container">
<Category title="游戏" >
<!-- 这个时候template必须要用 要把它包裹起来才可以收到Category组件发过来的内容 -->
<!-- scope 这个时候没有 d scope="games"把收过来的数据命名为games-->
<template scope="games">
<ul slot="center">
<li v-for="(g,index) in games.games" :key="index">{
{g}}</li>
</ul>
</template>
</Category>
<Category title="游戏" >
<template scope="games">
<ol slot="center">
<li v-for="(g,index) in games.games" :key="index">{
{g}}</li>
</ol>
</template>
</Category>
<Category title="游戏" >
<template scope="{games}">
<!-- es6写法 这样写之后 ,下面就不用写games. 了 -->
<h4 v-for="(g,index) in games" :key="index">{
{g}}</h4>
</template>
</Category>
</div>
</template>
<script>
import Category from './components/Category.vue';
export default{
name:"App",
components: {
Category
}
}
</script>
<style lang="css">
.container,.foot{
/* 弹性布局 */
display: flex;
/* */
justify-content: space-around;
}
</style>
Category.vue
<template>
<div class="category">
<h3>{
{title}}分类</h3>
<!-- 插槽 挖个坑,等着别人来这里 -->
<!-- 谁往这个插槽中放东西,这个:games="games" msg="hello"就传给谁
这个地方是可以传递多个值的 -->
<slot :games="games" msg="hello">我是默认值,当使用者没有传递具体结构时,我会出现</slot>
</div>
</template>
<script>
export default{
name:'Category',
props:['title'],
data(){
return{
games:['红色警戒','穿越火线','劲舞团','超级玛丽'],
}
},
}
</script>
<style scoped>
video{
width: 100%;
}
img{
width: 100%;
}
.category{
background-color:skyblue ;
width:200px;
height:300px;
}
h3{
text-align:center;
background-color: orange;
}
</style>
还没有评论,来说两句吧...