Skip to content

插槽 Slots

不同的父组件在引用子组件的时候,可能会针对子组件做一些定制,或者插入一些自己的 DOM 元素,这时就可以使用插槽。

子组件提供一个供父组件自定义的区域 <slot></slot> ,父组件引用的时候,可以传入自定义的 DOM 元素。

slot 可以分为两种类型:

  • 默认插槽:一个组件中只能定义一个
  • 具名插槽:带有标识符的插槽

默认插槽

子组件在需要插入默认内容的位置,使用 <slot></slot> 标签

vue
<template>
  <div>
    <slot></slot>
  </div>
</template>

父组件引用的时候,可以传入自定义的 DOM 元素

vue
<template>
  <div>
    <ChildComponent>
      <h1>Hello, World!</h1>
    </ChildComponent>
  </div>
</template>

具名插槽

具名插槽可以在子组件中定义多个,还可以根据需要灵活的将内容插入到想要插入的插槽中。

在子组件中,可以给 slot 标签添加一个 name 属性,来定义插槽的名称,没有提供 nameslot 会隐式地命名为 default

vue
<template>
  <div>
    <slot name="header"></slot>
    <slot></slot>
    <slot name="footer"></slot>
  </div>
</template>

父组件通过 v-slot:name 指令来引用具名插槽,指令可以使用缩写形式 #name,并传入自定义的 DOM 元素。

vue
<template>
  <div>
    <ChildComponent>
      <template v-slot:header>
        <h1>Header</h1>
      </template>
      <template #default>
        <p>Default Content</p>
      </template>
      <template #footer>
        <p>Footer</p>
      </template>
    </ChildComponent>
  </div>
</template>

动态组件

动态组件可以实现组件的动态切换,通过 <component> 标签的 is 属性来指定要渲染的组件。

vue
<template>
  <div>这是动态组件1</div>
</template>

<template>
  <div>这是动态组件2</div>
</template>
vue
<template>
  <div>
    <button @click="currentComponent = 'ChildComponent1'">ChildComponent1</button>
    <button @click="currentComponent = 'ChildComponent2'">ChildComponent2</button>
    <component :is="currentComponent"></component>
  </div>
</template>
<script setup>
import ChildComponent1 from './ChildComponent1.vue';
import ChildComponent2 from './ChildComponent2.vue';
import { ref } from 'vue';

const currentComponent = ref('ChildComponent1');
</script>

Released Under The MIT License.