slot插槽

理解

在我们的电脑主板上也有各种各样的插槽,有插CPU的,有插显卡的,有插内存的,有插硬盘的。我们可以理解slot为要占出当前的位置,方便我们插入内容。

或者可以这样理解:要去吃饭了,儿子先去占座,然后等他爸爸来了再一起吃。

slot的意思是插槽,Vue使用slot的作用是做内容分发。所谓的内容分发其实就是将父组件的内容放到子组件指定的位置叫做内容分发。

匿名插槽

  • 无name属性
  • 在组件中只可以使用一次
  • 父组件提供样式和内容
<!--子组件-->
<template>
    <div>
        <slot></slot>
        <h2>child子组件部分</h2>
    </div>
</template>
  <!-- 父组件-->
<template>
    <div class="father">
    <h3>这里是父组件</h3>
    <chlid>
        <div class="tmp1">
            <span>Leaf 1</span>
            <span>Leaf 2</span>
            <span>Leaf 3</span>
            <span>Leaf 4</span>
            <span>Leaf 5</span>
        </div>
    </child>
    </div>
</template>
<script>
import Child from '@/components/child'
export default {
    components:{
        child:child
    }
}
</script>
<style>
.tmp1 span{
    width: 50px;
    height: 50px;
    border:  1px solid black;
}
</style>

image.png
image.png

如果子组件没有<slot>,即使在父组件的子组件标签内容写了内容,也不会生效。子组件会直接覆盖。

所以是,slot是一个在子组件的占位符。

具名插槽

  • 有name属性
  • 在组件中可以使用N次
  • 父组件通过html模板上的slot属性关联具名插槽
  • 没有slot属性的html模板默认关联匿名模板
  • 父组件提供样式和内容
<!--子组件-->
<template>
    <div>
        <slot name="up"></slot>
        <h2>chlid子组件部分</h2>
        <slot name="down"></slot>
    </div>
</template>
<!--父组件-->
<template>
    <div class="father">
    <h3>这里是父组件</h3>
    <chlid>
        <div class="tmp1" slot="up">
            <span>Leaf 1</span>
            <span>Leaf 2</span>
            <span>Leaf 3</span>
            <span>Leaf 4</span>
            <span>Leaf 5</span>
        </div>
    <div class="tmp1" slot="down">
            <span>Leaf 6</span>
            <span>Leaf 7</span>
            <span>Leaf 8</span>
            <span>Leaf 9</span>
            <span>Leaf 10</span>
        </div>
    </child>
    </div>
</template>
<script>
import Child from '@/components/child'
export default {
    components:{
        child:child
    }
}
</script>
<style>
.tmp1 span{
    width: 50px;
    height: 50px;
    border:  1px solid black;
}
</style>
image.png

作用域插槽(带数据的插槽)

  • 父组件只提供样式,子组件提供内容
  • 在slot上面绑定数据
  • 子组件的值可以传给父组件使用
  • 父组件展示子组件数据有3种方式:flex显示、列表显示、直接显示
  • 使用slot-scope必须使用template
  • scope返回的值是slot标签上返回的所有属性值,并且是一个对象的形式保存起来
  • slot有两个属性,一个row,另一个是index
<!--子组件-->
<template>
    <div>
        <h2>chlid子组件部分</h2>
        <slot :data="data"></slot>
    </div>
</template>
<script>
export default {
  props: ["message"],
  data () {
      return {
          data: [''小庄','CC','小张','小林','Leaf','Bob']
      }
  }
}
</script>
<!--父组件-->
<template>
    <div class="father">
    <h3>这里是父组件</h3>
    <chlid>
      <!-- 第一次使用:用flex展示数据 -->
        <template slot-scope="user">
            <div class="tmp1">
                <span v-for="(item,index) in user.data" :key="index">{{item}}</span>
            </div>
        </template>
        <!-- 第二次使用:用列表展示数据 -->
        <template slot-scope="user">
            <ul>
                <li v-for="(item,index) in user.data" :key="index">{{item}}</li>
            </ul>
        </template>
        <!-- 第三次使用:直接显示 -->
        <template slot-scope="user">
          {{user.data}}
        </template>
    </child>
    </div>
</template>
<script>
import Child from '@/components/child'
export default {
    components:{
        child:child
    }
}
</script>
<style>
.tmp1 span{
    width: 50px;
    height: 50px;
    border:  1px solid black;
}
</style>

通过3种方式显示数据的最终呈现效果分别如下:

  • span:


    image.png
  • 列表显示
image.png
  • 直接显示


    image.png

父组件如果要使用这些数据必须要通过template模板结合slot-scope来呈现。

参考文章

对Vue插槽slot的理解

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项在...
    流年落盡阅读 1,065评论 0 0
  • vue里提供了一种将父组件的内容和子组件的模板整合的方法:内容分发,通过slot插槽来实现。 在组件标签内部写入的...
    视觉派Pie阅读 8,941评论 0 20
  • 什么是slot(插槽) 为了让组件可以组合,我们需要一种方式来混合父组件的内容与子组件自己的模板。这个过程被称为 ...
    lyp82nkl阅读 1,933评论 0 2
  • 今日笔记,slot插槽, 我男朋友跟我说,学习一样东西,你需要给自己提三个问题,然后带着这三个问题去研究, 于是我...
    Autumn_2460阅读 769评论 0 0
  • 什么是slot 为了让组件可以组合,我们需要一种方式来混合父组件的内容和子组件的模板,这个过程称为内容分发;Vue...
    泡杯感冒灵阅读 5,984评论 0 2