Vue中三种插槽slot使用示例

1、默认插槽

子组件Category:

// Category.vue
<template>
  <div class="category">
    <h3>{{title}}分类</h3>
    <slot/>
  </div>
</template>
 
<script>
  export default {
    name: 'Category',
    props: ['title'],
  }
</script>
 
<style scoped>
  .category{
    background-color: skyblue;
    width: 200px;
    height: 300px;
  }
 
  h3 {
    text-align: center;
    background-color: orange;
  }
 
  img {
    width: 100%;
  }
 
  video {
    width: 100%;
  }
</style>

父组件App:

// App.vue
<template>
  <div class="containter">
    <Category title='美食'>
      <img src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="" srcset="">
    </Category>
    <Category title='游戏'>
      <ul>
        <li v-for="(item, index) in games" :key='index'>{{item}}</li>
      </ul>
    </Category>
    <Category title='电影'>
      <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 {
    components:{
      Category,
    },
    data() {
      return {
        foods: ['火锅', '烧烤', '小龙虾', '牛排'],
        games: ['红色警戒', '穿越火线', '劲舞团', '超级玛丽'],
        films: ['《教父》', '《拆弹专家》', '《你好,李焕英》', '《尚硅谷》'],
      }
    },
  }
</script>
 
<style>
  .containter{
    display: flex;
    justify-content: space-around;
  }
</style>

2、具名插槽

子组件Category:

<template>
  <div class="category">
    <h3>{{title}}分类</h3>
    <slot name='center'/>
    <slot name='footer'/>
  </div>
</template>
 
<script>
  export default {
    name: 'Category',
    props: ['title'],
  }
</script>
 
<style scoped>
  .category{
    background-color: skyblue;
    width: 200px;
    height: 300px;
  }
 
  h3 {
    text-align: center;
    background-color: orange;
  }
 
  img {
    width: 100%;
  }
 
  video {
    width: 100%;
  }
</style>

父组件APP:

<template>
  <div class="containter">
    <Category title='美食'>
      <img slot='center' src="https://s3.ax1x.com/2021/01/16/srJlq0.jpg" alt="" srcset="">
      <a class="footer" slot='footer' href="https://www.baidu.com">更多美食</a>
    </Category>
    <Category title='游戏'>
      <ul slot="center">
        <li v-for="(item, index) in games" :key='index'>{{item}}</li>
      </ul>
      <div slot="footer" class="footer">
        <a href="https://www.baidu.com">单机游戏</a>
        <a href="https://www.baidu.com">网络游戏</a>
      </div>
    </Category>
    <Category title='电影'>
      <video slot="center" controls src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"></video>
      <!-- <template slot="footer"> -->
      <template v-slot:footer>
        <div class="footer">
          <a href="https://www.baidu.com">经典</a>
          <a href="https://www.baidu.com">热门</a>
          <a href="https://www.baidu.com">推荐</a>
        </div>
        <h4>欢迎前来观影</h4>
      </template>
    </Category>
  </div>
</template>
 
<script>
  import Category from './components/Category.vue';
 
  export default {
    components:{
      Category,
    },
    data() {
      return {
        foods: ['火锅', '烧烤', '小龙虾', '牛排'],
        games: ['红色警戒', '穿越火线', '劲舞团', '超级玛丽'],
        films: ['《教父》', '《拆弹专家》', '《你好,李焕英》', '《尚硅谷》'],
      }
    },
  }
</script>
 
<style>
  .containter, .footer{
    display: flex;
    justify-content: space-around;
  }
  h4 {
    text-align: center;
  }
</style>






扫描下方二维码,关注公众号:程序进阶之路,实时获取更多优质文章推送。


扫码关注

评论