1. 子组件创建过程中,预留一个位置 slot,将其作为一个占位符,父组件传递进来的内容就会渲染在这里
仅预留位置
<template>
<div>
//内容
<slot />
</div>
</template>
默认插槽 Default Slot - 只有一个插槽的情况;可以指定默认内容,避免插槽没有内容导致告警
<template>
<div>
//内容
<slot>插槽默认内容</slot>
</div>
</template>
具名插槽 Named Slots - 多个插槽;使用属性 name 区分;没有指定 name 的,使用默认名字 default;同样可以指定默认内容
<template>
<div>
//内容
<slot></slot>
<slot name = 'header'></slot>
<slot name = 'footer'></slot>
</div>
</template>
条件插槽 Conditional Slots - 利用插槽的 $slots 属性判断;多用于具名插槽;只有当父组件提供了相应的插槽内容时,才会渲染对应的 DOM 结构;非条件插槽则必须使用
<template>
<div>
//内容
<slot></slot>
<slot name = 'header'></slot>
<div v-if="$slots.footer">
<slot name = 'footer'></slot>
</div>
</div>
</template>
2. 父组件
使用内容填充插槽;可以是普通文本,也可以是HTML节点
<template>
<AlertBox> Something bad happened. </AlertBox>
</template>
使用默认插槽
<template>
<AlertBox> </AlertBox>
</template>
使用具名插槽 - 使用 <template> 并指定对应的 v-slot 标识;可以简写为 #
<template>
<AlertBox>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
<template #footer>
<h1>Here might be a page title</h1>
</template>
</AlertBox>
</template>
使用条件插槽 - 不指定 footer
<template>
<AlertBox>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
</AlertBox>
</template>