vue插槽(slot)详解

r囧r小猫 2022-11-05 08:35 358阅读 0赞

最近被问起是否了解vue的插槽(slot),咋一想发现,似乎很少用到这玩意。所以整理了下slot的一些用法。

slot (父组件 在子组件 处插入内容)

Vue 实现了一套内容分发的 API,将<slot>元素作为承载分发内容的出口,这是vue文档上的说明。具体来说,slot就是可以让你在组件内添加内容的‘空间’。举个例子:

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. </div>
  6. </template>
  7. //父组件:(引用子组件 ebutton)
  8. <template>
  9. <div class= 'app'>
  10. <ebutton> </ebutton>
  11. </div>
  12. </template>

我们知道,如果直接想要在父组件中的 中添加内容,是不会在页面上渲染的。那么我们如何使添加的内容能够显示呢?在子组件内添加slot 即可。

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button></button>
  5. <slot></slot> //slot 可以放在任意位置。(这个位置就是父组件添加内容的显示位置)
  6. </div>
  7. </template>

子组件可以在任意位置添加slot , 这个位置就是父组件添加内容的显示位置。

编译作用域 (父组件 在子组件 处插入 data)

上面我们了解了,slot 其实就是能够让我们在父组件中添加内容到子组件的‘空间’。我们可以添加父组件内任意的data值,比如这样:

  1. //父组件:(引用子组件 ebutton)
  2. <template>
  3. <div class= 'app'>
  4. <ebutton> {
  5. { parent }}</ebutton>
  6. </div>
  7. </template>
  8. new Vue({
  9. el:'.app',
  10. data:{
  11. parent:'父组件'
  12. }
  13. })

使用数据的语法完全没有变,但是,我们能否直接使用子组件内的数据呢?显然不行!!

  1. // 子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. <slot></slot>
  6. </div>
  7. </template>
  8. new Vue({
  9. el:'.button',
  10. data:{
  11. child:'子组件'
  12. }
  13. })
  14. // 父组件:(引用子组件 ebutton)
  15. <template>
  16. <div class= 'app'>
  17. <ebutton> {
  18. { child }}</ebutton>
  19. </div>
  20. </template>

直接传入子组件内的数据是不可以的。因为:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

后备内容 (子组件 设置默认值)

所谓的后背内容,其实就是slot的默认值,有时我没有在父组件内添加内容,那么 slot就会显示默认值,如:

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. <slot> 这就是默认值 </slot>
  6. </div>
  7. </template>

具名插槽 (子组件 多个 对应插入内容)

有时候,也许子组件内的slot不止一个,那么我们如何在父组件中,精确的在想要的位置,插入对应的内容呢? 给插槽命一个名即可,即添加name属性。

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. <slot name= 'one'> 这就是默认值1</slot>
  6. <slot name='two'> 这就是默认值2 </slot>
  7. <slot name='three'> 这就是默认值3 </slot>
  8. </div>
  9. </template>

父组件通过v-slot : name 的方式添加内容:

  1. //父组件:(引用子组件 ebutton)
  2. <template>
  3. <div class= 'app'>
  4. <ebutton>
  5. <template v-slot:one> 这是插入到one插槽的内容 </template>
  6. <template v-slot:two> 这是插入到two插槽的内容 </template>
  7. <template v-slot:three> 这是插入到three插槽的内容 </template>
  8. </ebutton>
  9. </div>
  10. </template>

当然 vue 为了方便,书写 v-slot:one 的形式时,可以简写为 #one

作用域插槽 ( 父组件 在子组件 处使用子组件 data)

通过slot 我们可以在父组件为子组件添加内容,通过给slot命名的方式,我们可以添加不止一个位置的内容。但是我们添加的数据都是父组件内的。上面我们说过不能直接使用子组件内的数据,但是我们是否有其他的方法,让我们能够使用子组件的数据呢? 其实我们也可以使用v-slot的方式:

  1. //子组件 : (假设名为:ebutton)
  2. <template>
  3. <div class= 'button'>
  4. <button> </button>
  5. <slot name= 'one' :value1='child1'> 这就是默认值1</slot> //绑定child1的数据
  6. <slot :value2='child2'> 这就是默认值2 </slot> //绑定child2的数据,这里我没有命名slot
  7. </div>
  8. </template>
  9. new Vue({
  10. el:'.button',
  11. data:{
  12. child1:'数据1',
  13. child2:'数据2'
  14. }
  15. })
  16. //父组件:(引用子组件 ebutton)
  17. <template>
  18. <div class= 'app'>
  19. <ebutton>
  20. <template v-slot:one = 'slotone'>
  21. {
  22. { slotone.value1 }} // 通过v-slot的语法 将子组件的value1值赋值给slotone
  23. </template>
  24. <template v-slot:default = 'slottwo'>
  25. {
  26. { slottwo.value2 }} // 同上,由于子组件没有给slot命名,默认值就为default
  27. </template>
  28. </ebutton>
  29. </div>
  30. </template>

总结来说就是:

  • 首先在子组件的slot上动态绑定一个值( :key=’value’)
  • 然后在父组件通过v-slot : name = ‘values ’的方式将这个值赋值给 values
  • 最后通过{ { values.key }}的方式获取数据

发表评论

表情:
评论列表 (有 0 条评论,358人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vue--slot

    前言:使用的插槽是2.6.0以后的,以前的废弃用法,暂且不谈,要了解看[文档][Link 1] 一、具名插槽 如下:(使用v-slot:xxx语法) 一个不带 na

    相关 vue slot

    一、介绍:slot可以理解为占位符,在子组件中给父组件站位。 二、举例说明: 1、没有插槽: (1)父组件: <template> <div>

    相关 vueslot详解

    最近被问起是否了解vue的插槽(slot),咋一想发现,似乎很少用到这玩意。所以整理了下slot的一些用法。 slot (父组件 在子组件<slot> </slot>处插入

    相关 Vue slot

    我们对于slot这个概念或许不是很清楚,但是我们在实际的使用中可能已经遇到很多次了。比如我们在使用ivew组件库的时候,就会经常遇到slot这个单词。而实际上,slot的使用更