# 插槽 Slots
# 1、默认插槽
组件模板:
<button class="fancy-btn">
  <slot></slot> <!-- 插槽出口 -->
</button>
 1
2
3
2
3
使用组件:
<FancyButton>
  Click me! <!-- 插槽内容 -->
</FancyButton>
 1
2
3
2
3
最终渲染:
<button class="fancy-btn">Click me!</button>
 1
# 2、默认内容
在外部没有提供任何内容的情况下,可以为插槽指定默认内容。
<button type="submit">
  <slot>
    Submit <!-- 默认内容 -->
  </slot>
</button>
 1
2
3
4
5
2
3
4
5
使用组件:
<SubmitButton />
 1
最终渲染:
<button type="submit">Submit</button>
 1
如果提供了插槽内容:
<SubmitButton>Save</SubmitButton>
 1
那么被显式提供的内容会取代默认内容:
<button type="submit">Save</button>
 1
# 3、具名插槽
给各个插槽分配唯一的 ID,以确定每一处要渲染的内容:
<div class="container">
  <header>
    <slot name="header"></slot>
  </header>
  <main>
    <slot></slot>
  </main>
  <footer>
    <slot name="footer"></slot>
  </footer>
</div>
 1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
使用组件:
<BaseLayout>
  <template v-slot:header>
    <!-- header 插槽的内容放这里 -->
  </template>
</BaseLayout>
 1
2
3
4
5
2
3
4
5
v-slot 有对应的简写 #,因此 <template v-slot:header> 可以简写为 <template #header>。其意思就是“将这部分模板片段传入子组件的 header 插槽中”。
完整调用方式:
<BaseLayout>
  <template #header>
    <h1>Here might be a page title</h1>
  </template>
  <template #default>
    <p>A paragraph for the main content.</p>
    <p>And another one.</p>
  </template>
  <template #footer>
    <p>Here's some contact info</p>
  </template>
</BaseLayout>
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
最终渲染:
<div class="container">
  <header>
    <h1>Here might be a page title</h1>
  </header>
  <main>
    <p>A paragraph for the main content.</p>
    <p>And another one.</p>
  </main>
  <footer>
    <p>Here's some contact info</p>
  </footer>
</div>
 1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 4、条件插槽
<template>
  <div class="card">
    <div v-if="$slots.header" class="card-header">
      <slot name="header" />
    </div>
    <div v-if="$slots.default" class="card-content">
      <slot />
    </div>
    <div v-if="$slots.footer" class="card-footer">
      <slot name="footer" />
    </div>
  </div>
</template>
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15