Vue v-slot

我们需要 v-slot 指令来引用命名的 slot

命名 slot 可以更好地控制内容在子组件模板中的放置位置。

命名 slot 可以用于创建更灵活和可重用的组件。在使用 v-slot 和命名 slot 之前,让我们看看如果在组件中使用两个 slot 会发生什么:

实例

App.vue:

  1. <h1>App.vue</h1>
  2. <p>The component has two div tags with one slot in each.</p>
  3. <slot-comp>'Hello!'</slot-comp>

SlotComp.vue:

  1. <h3>Component</h3>
  2. <div>
  3. <slot></slot>
  4. </div>
  5. <div>
  6. <slot></slot>
  7. </div>

在一个组件中有两个 Slot(插槽)时,我们可以看到内容只是同时出现在两个位置。


v-slot 与命名 Slot

如果我们在一个组件中有多个 <slot>,但我们想控制内容应该出现在哪个 <slot> 中,我们需要命名 Slot 并使用 v-slot 将内容发送到正确的位置。

实例

为了能够区分插槽(slot),我们为插槽提供了不同的名称。

SlotComp.vue:

  1. <h3>Component</h3>
  2. <div>
  3. <slot name="topSlot"></slot>
  4. </div>
  5. <div>
  6. <slot name="bottomSlot"></slot>
  7. </div>

现在我们可以在 App.vue 中使用 v-slot 将内容引导到正确的 slot。

App.vue:

  1. <h1>App.vue</h1>
  2. <p>The component has two div tags with one slot in each.</p>
  3. <slot-comp v-slot:bottomSlot>'Hello!'</slot-comp>

默认 Slot

如果您有一个没有名称的 <slot>,那么对于标记有v-slot的组件,该 <slot> 将是默认的:default,或者没有标记有 v-slot 的组件。

要了解这是如何工作的,我们只需要在前面的实例中进行两个小的更改:

实例

SlotComp.vue:

  1. <h3>Component</h3>
  2. <div>
  3. <slot name="topSlot"></slot>
  4. </div>
  5. <div>
  6. <slot name="bottomSlot"></slot>
  7. </div>

App.vue:

  1. <h1>App.vue</h1>
  2. <p>The component has two div tags with one slot in each.</p>
  3. <slot-comp v-slot:bottomSlot>'Hello!'</slot-comp>

如前所述,我们可以使用默认值 v-slot:default 来标记内容,以便更清楚地表明内容属于默认 slot。

实例

SlotComp.vue:

  1. <h3>Component</h3>
  2. <div>
  3. <slot></slot>
  4. </div>
  5. <div>
  6. <slot name="bottomSlot"></slot>
  7. </div>

App.vue:

  1. <h1>App.vue</h1>
  2. <p>The component has two div tags with one slot in each.</p>
  3. <slot-comp v-slot:default>'Default slot'</slot-comp>

<template> 中的 v-slot

正如您所看到的,v-slot 指令可以用作组件标记中的属性。

v-slot 也可以在 <template> 标签中使用,将内容的较大部分引导到某个 v-slot

实例

App.vue:

  1. <h1>App.vue</h1>
  2. <p>The component has two div tags with one slot in each.</p>
  3. <slot-comp>
  4. <template v-slot:bottomSlot>
  5. <h4>To the bottom slot!</h4>
  6. <p>This p tag and the h4 tag above are directed to the bottom slot with the v-slot directive used on the template tag.</p>
  7. </template>
  8. <p>This goes into the default slot</p>
  9. </slot-comp>

SlotComp.vue:

  1. <h3>Component</h3>
  2. <div>
  3. <slot></slot>
  4. </div>
  5. <div>
  6. <slot name="bottomSlot"></slot>
  7. </div>

我们使用 <template> 标记将某些内容定向到某个 <slot>,因为 <template> 标签没有呈现,它只是内容的占位符。你可以通过检查构建的页面来看到这一点:你在那里找不到模板标记。


v-slot 简写

v-slot: 的简写为 #

比如:

  1. <slot-comp v-slot:topSlot>'Hello!'</slot-comp>

可以写为:

  1. <slot-comp #topSlot>'Hello!'</slot-comp>
实例

App.vue:

  1. <h1>App.vue</h1>
  2. <p>The component has two div tags with one slot in each.</p>
  3. <slot-comp #topSlot>'Hello!'</slot-comp>

SlotComp.vue:

  1. <h3>Component</h3>
  2. <div>
  3. <slot name="topSlot"></slot>
  4. </div>
  5. <div>
  6. <slot name="bottomSlot"></slot>
  7. </div>