slot content

v-slot 是一种组件内容复用的方式。可以向父级组件中传入特定的内容,使得其渲染到特定的位置。

  1. <!-- 子级组件 -->
  2. <a :href="url">
  3. <strong>Error, </strong>
  4. <slot>AHA</slot>
  5. </a>
  6. <!-- 父级组件 -->
  7. <navigation-link>
  8. <template v-slot:default>
  9. hello v-slot
  10. </template>
  11. </navigation-link>

compilation scope

父级组件和子组件中变量的作用域,在默认情况下都是仅限于当前组件。

fallback content

可以在子组件中设置一个 fallback 内容,当父级组件没有设置内容时作为默认内容来进行展示。

  1. <button type="submit">
  2. <slot>Submit</slot>
  3. </button>

named slots

我们可以在子组件中设置多个 slot 并为其设置特定的名字,这样在父级组件传值的时候就可以将其传递到特定的位置,更为精细的控制传值方式。

  1. <div class="container">
  2. <header>
  3. <slot name="header"></slot>
  4. </header>
  5. <main>
  6. <slot></slot>
  7. </main>
  8. <footer>
  9. <slot name="footer"></slot>
  10. </footer>
  11. </div>
  12. <!-- 使用方式 -->
  13. <base-layout>
  14. <template v-slot:header>
  15. <h1>Here might be a page title</h1>
  16. </template>
  17. <p>A paragraph for the main content.</p>
  18. <p>And another one.</p>
  19. <template v-slot:footer>
  20. <p>Here's some contact info</p>
  21. </template>
  22. </base-layout>

scoped slots

通过设置 scoped slots 可以将子组件中的数据传递给父级组件,可以在父级组件中来决定传递给子组件的值是多少。

  1. <!-- 子级组件 -->
  2. <div>
  3. <slot :user="user">
  4. {{ user.lastName }}
  5. </slot>
  6. </div>
  7. <current-user>
  8. <template v-slot:default="{ user }">
  9. {{ user.lastName }}
  10. </template>
  11. </current-user>

在子组件中设定好 user 的值,并作为 props 通过 <slot></slot> 传入到父级组件,这样父级组件就可以访问到这个 user 值。

dynamic slot name

动态的设置具名 slot 的值。

  1. <base-layout>
  2. <template v-slot:[dynamicSlotName]>
  3. ...
  4. </template>
  5. </base-layout>

使用 [] 来设置具名 slot 的名字。

abbreviated syntax and deprecated syntax

default 缩略

  1. <current-user v-slot:default="slotProps">
  2. {{ slotProps.user.firstName }}
  3. </current-user>
  4. <current-user v-slot="slotProps">
  5. {{ slotProps.user.firstName }}
  6. </current-user>

在使用 scope slots 特性时,可以省去 :default 的书写以及对应的 <template> 标签包裹。

named slots shorhand

  1. <base-layout>
  2. <template #header>
  3. <h1>Here might be a page title</h1>
  4. </template>
  5. <p>A paragraph for the main content.</p>
  6. <p>And another one.</p>
  7. <template #footer>
  8. <p>Here's some contact info</p>
  9. </template>
  10. </base-layout>
  11. <current-user #default="{ user }">
  12. {{ user.firstName }}
  13. </current-user>

使用 #name 来代替 v-slot:name 。使用 default 的时候,需要设置为 #slot

deprecated syntax

  1. <base-layout>
  2. <template slot="header">
  3. <h1>Here might be a page title</h1>
  4. </template>
  5. <p>A paragraph for the main content.</p>
  6. <p>And another one.</p>
  7. <template slot="footer">
  8. <p>Here's some contact info</p>
  9. </template>
  10. </base-layout>
  1. <slot-example>
  2. <template slot="default" slot-scope="slotProps">
  3. {{ slotProps.msg }}
  4. </template>
  5. </slot-example>

现语法和淘汰语法的对比

对比项目 现语法 淘汰的语法
具名slot v-slot:name slot=”name”
scoped slots v-slot:default=”slotProps” slot-scope=”slotProps”