Vue3 中插槽(slot)的用法

Vue3 中插槽(slot)的用法

概要

Vue3(其实从2.6开始)中引入了一个新的指令v-slot,用来表示具名插槽和默认插槽

基础示例


<foo v-slot="{ msg }">
    {{ msg }}
foo>


<foo>
    <template v-slot:one="{msg}">
        {{ msg }}
    template> 
foo>

为什么要这么做

在v2.5中介绍了slot-scope,可以直接在插槽元素上使用。

<foo>
    <div slot-scope="{ msg }">
        {{ msg }}
    div>
foo>

同样的,我们也可以在组件上这样使用。

<foo>
    <bar slot-scope="{ msg }">
        {{ msg }}
    bar>
foo>

然而,上面的示例会导致一个问题:slot-scope的位置不能清晰的反映出这个作用域变量是哪一个 组件提供的。上面例子中slot-scope是写在组件上,但是实际上这个作用域变量的定义是有组件的默认插槽提供的。
当嵌套的层级越深,情况就会变得越糟。

<foo>
  <bar slot-scope="foo">
    <baz slot-scope="bar">
      <div slot-scope="baz">
        {{ foo }} {{ bar }} {{ baz }}
      div>
    baz>
  bar>
foo>

像上面这种情况,我们无法立即分辨出模板上作用域变量是由那一个组件提供的。

细节设计

引入一个新的指令v-slot

我们可以在slot容器