Vue v-slot 指令

v-slot 和命名槽

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

示例

为了能够区分插槽,我们为插槽指定了不同的名称。

SlotComp.vue:

<h3>组件</h3>
<div>
  <slot name="topSlot"></slot>
</div>
<div>
  <slot name="bottomSlot"></slot>
</div>

现在我们可以在 App.vue 中使用 v-slot 将内容定向到右侧插槽。

App.vue:

<h1>App.vue</h1>
<p>该组件有两个 div 标签,每个标签中有一个插槽。</p>
<slot-comp v-slot:bottomSlot>'Hello!'</slot-comp>
运行示例 »

默认插槽

如果您的 <slot> 没有名称,则 <slot> 将是标有 v-slot:default 的组件或未标有 v-slot 的组件的默认值。

要了解其工作原理,我们只需在前面的示例中进行两个小更改:

示例

SlotComp.vue:

<h3>组件</h3>
<div>
  <slot name="topSlot"></slot>
</div>
<div>
  <slot name="bottomSlot"></slot>
</div>

App.vue:

<h1>App.vue</h1>
<p>该组件有两个 div 标签,每个标签中有一个插槽。</p>
<slot-comp v-slot:bottomSlot>'Hello!'</slot-comp>
运行示例 »

正如已经提到的,我们可以使用默认值 v-slot:default 标签内容,以更加清楚地表明该内容属于默认槽。

示例

SlotComp.vue:

<h3>组件</h3>
<div>
  <slot></slot>
</div>
<div>
  <slot name="bottomSlot"></slot>
</div>

App.vue:

<h1>App.vue</h1>
<p>该组件有两个 div 标签,每个标签中有一个插槽。</p>
<slot-comp v-slot:default>'Default slot'</slot-comp>
运行示例 »

v-slot in <template>

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

v-slot 也可以用在 <template> 标签中,将大部分内容定向到某个 <slot>

示例

App.vue:

<h1>App.vue</h1>
<p>该组件有两个 div 标签,每个标签中有一个插槽。</p>
<slot-comp>
  <template v-slot:bottomSlot>
    <h4>到底部插槽!</h4>
    <p>这个 p 标签和上面的 h4 标签通过模板标签上使用的 v-slot 指令定向到底部插槽。</p>
  </template>
  <p>这会进入默认插槽</p>
</slot-comp>

SlotComp.vue:

<h3>组件</h3>
<div>
  <slot></slot>
</div>
<div>
  <slot name="bottomSlot"></slot>
</div>
运行示例 »

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


v-slot 简写 #

v-slot: 的简写是 #

这意味着:

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

可以写成:

<slot-comp #topSlot>'Hello!'</slot-comp>

示例

App.vue:

<h1>App.vue</h1>
<p>该组件有两个 div 标签,每个标签中有一个插槽。</p>
<slot-comp #topSlot>'Hello!'</slot-comp>

SlotComp.vue:

<h3>组件</h3>
<div>
  <slot name="topSlot"></slot>
</div>
<div>
  <slot name="bottomSlot"></slot>
</div>
运行示例 »

Vue 练习

通过练习测试自己

练习题:

如果一个组件"CompOne"有两个插槽,如下所示:

<slot name="headerSlot"></slot>

<slot name="mainSlot"></slot>

我们如何从 App.vue 将文本 "Animals are interesting!" 定向到 "CompOne" 中的插槽 "mainSlot"?

<slot-comp >
    Animals are interesting!
</slot-comp>

开始练习