Vue实现了一套内容分发的API,将元素作为承载分发内容的出口。

1.内容分发

例如有一个模板为以下格式的Card.vue的组件

  1. <template>
  2. <div>
  3. <h1>{{ title }}</h1>
  4. <div>
  5. <slot></slot>
  6. </div>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. props: {
  12. title: {
  13. type: String,
  14. default: ''
  15. },
  16. content: {
  17. type: String,
  18. default: ''
  19. }
  20. }
  21. }
  22. </script>

当card.vue在其他页面调用时,card见的内容将替换slot。

  1. <template>
  2. <div>
  3. <card>
  4. 自定义内容
  5. </card>
  6. </div>
  7. </template>
  8. <script>
  9. import Card from 'Card.vue'
  10. export default {
  11. components: {
  12. Card
  13. }
  14. }
  15. </script>

2.作用域

父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。父级模板无法访问子组件中的属性。

3.插槽默认值

在没有提供内容时,为插槽设置默认值是很有用的。

  1. <template>
  2. <div>
  3. <h1>{{ title }}</h1>
  4. <div>
  5. <slot>插槽默认值</slot>
  6. </div>
  7. </div>
  8. </template>

4.命名插槽

有时候组件内部 需要多个插槽,为了区分不同的插槽进行分发,需要slot额外的属性来标识,对于这样的情况slot元素有一个特殊的name属性。

  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>

不带name的slot出口带有隐含的名字default