一文解析Vue中的插槽(slot)

本篇文章带大家深入了解一下vue中的插槽(slot),带你玩转Vue插槽,希望对大家有所帮助!

一文解析Vue中的插槽(slot)

Vue 中,插槽是个很强大的功能,它可以使封装的组件灵活性增强很多,比如你在封装一个组件时使用了插槽,那在父组件调用时,这里的内容就可以由父组件自由定义,而无需在封装组件时苦想如何覆盖各种使用场景。(学习视频分享:vue视频教程)

基础插槽

假设我们现在有一个需要封装的组件 SlotComponent

<template>
  <div>这是一个slot:<slot> </slot></div>
</template>
<SlotComponent>来自父组件的内容</SlotComponent>

slot 中的内容就可以在父组件中任意定义。要是组件中没有元素,那么在父组件调用时,组件起始和结束标签之间的内容就都会丢失掉。

既然 slot 是在 SlotComponent组件中的,那在父组件中调用的时候能否能使用 SlotComponent 组件里的数据呢 ? 显然是不能的,因为他们所处的作用域并不相同。

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

插槽的默认内容

插槽也可以设置默认的内容,这有点像 es6 中函数参数的默认值,当父组件调用时并没有提供内容,那么这个默认值就会被渲染出来。提供了内容的话,则会替代默认内容。

<template>
  <div>
    <slot>这是slot的默认内容</slot>
  </div>
</template>
<DefaultSlot></DefaultSlot>

在调用时标签之间并没有提供内容,默认值得以渲染,成为一个兜底内容。

1.png

具名插槽

如果在组件中我需要多个地方用到插槽,那就需要给 slot 添加 name,来区分内容渲染到什么地方。

// named slot,名字叫 NamedSlot
<template>
  <div>
    这是具名插槽
    <div>
      <slot name="slot1"></slot>
    </div>
    <div>
      <slot name="slot2"></slot>
    </div>
    <div>
      <slot name="slot3"></slot>
    </div>
  </div>
</template>

// 在父组件中调用
<NamedSlot>
    <template v-slot:slot1>这是插入slot1的内容</template>
    <template v-slot:slot2>这是插入slot2的内容</template>
    <template v-slot:slot3>这是插入slot3的内容</template>
</NamedSlot>

slot 加上 name 属性后,可以通过 v-slot:slotName的形式分发内容。不给 name 属性的话,就默认namedefault,等同于 v-slot:default,也可以缩写为#default

注意, v-slot 只能添加在