Vue插槽

文章展示了如何在Vue.js中使用插槽来实现组件的自定义内容插入,包括默认插槽、具名插槽和作用域插槽的用法。通过插槽,父组件可以向子组件传递不同的结构和数据,增强了组件的可复用性和灵活性。
摘要由CSDN通过智能技术生成

 

 

默认插槽

src/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="电影">
            <video src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" controls></video>
        </Category>
    </div>
</template>

<script>
import Category from './components/Category'
export default {
    name: 'App',
    components: { Category },
    data() {
        return {
            foods: ['火锅', '烧烤', '小龙虾', '烧烤'],
            games: ['红色警戒', '穿越火线', '劲舞团', '超级玛丽'],
            films: ['《教父》', '《拆弹专家》', '《你好·李焕英》', '《尚硅谷》']
        }
    }
}
</script>

<style>
.container {
    display: flex;
    justify-content: space-around;
}
img{
    width: 100%;
}

video{
    width: 100%;
}
</style>

src/components/Category.vue

<template>
  <div class="category">
    <h3>{{ title }}分类</h3>
    <!-- 定义一个插槽(挖个坑,等着组件的使用者进行填充 -->
    <slot>我是一些默认值,当使用者没有传递具体结构时,我会出现</slot>
    
  </div>
</template>

<script>
export default {
  name: 'Category',
  props:['title']
}
</script>
<style>
    .category{
        background-color: lightblue;
        width: 200px;
        height: 300px;
    }
    h3{
        text-align: center;
        background-color: orange;
    }
</style>

具名插槽

src/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="电影">
            <video slot="center" src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" controls></video>
            <!-- <div slot="footer">
                <div class="foot">
                    <a href="http://www.atguigu.com">经典</a>
                    <a href="http://www.atguigu.com">热门</a>
                    <a href="http://www.atguigu.com">推荐</a>
                </div>
                <h4 class="foot">欢迎前来观影</h4>
            </div> -->

            <template v-slot:footer>
                <div class="foot">
                    <a href="http://www.atguigu.com">经典</a>
                    <a href="http://www.atguigu.com">热门</a>
                    <a href="http://www.atguigu.com">推荐</a>
                </div>
                <h4 class="foot">欢迎前来观影</h4>
            </template>
        </Category>
    </div>
</template>

<script>
import Category from './components/Category'
export default {
    name: 'App',
    components: { Category },
    data() {
        return {
            foods: ['火锅', '烧烤', '小龙虾', '烧烤'],
            games: ['红色警戒', '穿越火线', '劲舞团', '超级玛丽'],
            films: ['《教父》', '《拆弹专家》', '《你好·李焕英》', '《尚硅谷》']
        }
    }
}
</script>

<style>
.container,
.foot {
    display: flex;
    justify-content: space-around;
}

img {
    width: 100%;
}

video {
    width: 100%;
}
</style>

src/components/Category.vue

<template>
  <div class="category">
    <h3>{{ title }}分类</h3>
    <!-- 定义一个插槽(挖个坑,等着组件的使用者进行填充 -->
    <slot name="center">我是一些默认值,当使用者没有传递具体结构时,我会出现1</slot>
    <slot name="footer">我是一些默认值,当使用者没有传递具体结构时,我会出现2</slot>
    
  </div>
</template>

<script>
export default {
  name: 'Category',
  props:['title']
}
</script>
<style>
    .category{
        background-color: lightblue;
        width: 200px;
        height: 300px;
    }
    h3{
        text-align: center;
        background-color: orange;
    }
</style>

注意:只有<template v-slot:footer></template>可以使用v-slot:footer等价于<div class="footer"></div>

作用域插槽

src/components/Category.vue

<template>
  <div class="category">
    <h3>{{ title }}分类</h3>
    <!-- 定义一个插槽(挖个坑,等着组件的使用者进行填充 -->
    <slot :games="games">我是一些默认值,当使用者没有传递具体结构时,我会出现</slot>

  </div>
</template>

<script>
export default {
  name: 'Category',
  props: ['title'],
  data() {
    return {
      games: ['红色警戒', '穿越火线', '劲舞团', '超级玛丽'],
    }
  }
}
</script>
<style>
.category {
  background-color: lightblue;
  width: 200px;
  height: 300px;
}

h3 {
  text-align: center;
  background-color: orange;
}
</style>

src/App.vue

<template>
    <div class="container">
        <Category title="游戏">
            <template scope="atguigu">
                {{atguigu}}
                <ul>
                    <li v-for="(g, index) in atguigu.games" :key="index">{{ g }}</li>
                </ul>
            </template>
        </Category>
        <Category title="游戏">
            <template scope="{games}">
                <ol>
                    <li v-for="(g, index) in games" :key="index">{{ g }}</li>
                </ol>
            </template>
        </Category>
        <Category title="游戏">
            <template slot-scope="{games}">
                <h4 v-for="(g, index) in games" :key="index">{{ g }}</h4>
            </template>
        </Category>
    </div>
</template>

<script>
import Category from './components/Category'
export default {
    name: 'App',
    components: { Category },

}
</script>

<style scoped>
.container,
.foot {
    display: flex;
    justify-content: space-around;
}

img {
    width: 100%;
}

video {
    width: 100%;
}

h4{
    text-align: center;
}
</style>

总结:插槽的使用者往插槽里面塞东西,但是作用域插槽,有一种感觉数据流逆着过去了 

{{atguigu}}是个对象

默认插槽与具名插槽:根据父组件的数据生成结构传递给子组件

作用域插槽:父组件根据子组件传递的数据生成dom 传递给子组件

解构赋值{games}解释:let {games}={'games':[数据]} ,这样直接用games就相当于数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值