当我们封装一个组件时,不希望里面的内容写死,希望使用的时候能够自定义里面的内容,这时我们就需要使用到插槽
插槽是什么呢
插槽是子组件提供给父组件的一个占位符,用slot标签表示,父组件可以在这个标签填写任何模板代码
插槽的基本使用
我们在组件需要定制的地方用<slot></slot>标签占位
<slot></slot>
</div>
<div class="dialog-footer">
<button>取消</button>
<button>确认</button>
</div>
</div>
在父组件用上这个组件时,在标签里面添上内容
效果显示如下,传入的内容会替代slot标签
插槽的默认内容
在外部没有提供任何内容的情况,可以为插槽指定默认内容
<slot>hello</slot>
当父组件没有使用这个组件提供内容时,默认内容会被渲染,如果提供了插槽内容将取代默认内容
具名插槽
有时候一个组件需要提供多个插槽出口,但之前的方式只能提供一个插槽出口
这时候我们需要给插槽提供一个属性,使它成为唯一可识别的ID,没有命名的插槽默认名为default
<h3>
<!--给slot提供属性name-->
<slot name="title"></slot>
</h3>
<span class="close">✖️</span>
</div>
<div class="dialog-content">
<!--给slot提供属性name-->
<slot name="content"></slot>
</div>
v-slot指令
在为具名插槽传入内容时,我们需要使用一个含有v-slot指令的<template>标签,并将目标插槽的名字传给指令
<MyDialog>
<template v-slot:title>
警告
</template>
<template v-slot:content>
当前未保存,你确定要退出吗
</template>
</MyDialog>
v-slot可以简写为#
<MyDialog>
<template #title>
警告
</template>
<template #content>
当前未保存,你确定要退出吗
</template>
</MyDialog>
作用域插槽
插槽要同时使用父组件和子组件的数据
将组件的值传出去
<tr v-for="(item,index) in data" :key="item.id">
<slot name="body" :item="item" :index="index"></slot>
</tr>
<template #body={item,index}>
<td>{{index+1}}</td>
<td><img src="item.picture"></td>
<td>{{item.name}}</td>
<td>
<MyTag v-model="temtext2"></MyTag>
</td>
</template>