slot 是什么
Vue的slot,是组件的一块HTML模版,这块模版由使用组件者即父组件提供。可以说是子组件暴露的一个让父组件传入自定义内容的接口。
官网的解释是:

slot的作用
就是可以拓展组件,根据特殊情况特殊处理
slot的用法
slot-scope :
已经废弃了,在编辑器里甚至会提示,就不讲解这个的用法了。

v-slot:
默认的插槽
父级组件
<template>
<div>
<span>我是父级组件</span>
<hr>
<ChildrenCom>
<template>
<span>我是插槽</span>
</template>
</ChildrenCom>
</div>
</template>子组件
<template>
<div>
<!-- 默认插槽 -->
<slot></slot>
</div>
</template>如果子组件的 slot 不给 name ,就是默认的 ,也就是 <slot name="default"></slot>
default 不需要写,所以可以省略
指定插槽
父级组件
<template>
<div>
<span>我是父级组件</span>
<hr>
<ChildrenCom>
<template v-slot:hasName>
<span>我是插槽 hasName</span>
</template>
</ChildrenCom>
</div>
</template>子级组件
<template>
<div>
<!-- 默认插槽 -->
<slot></slot>
<!-- 默认插槽 (可以省略的) -->
<slot name="default"></slot>
<!-- 指定插槽 -->
<slot name="hasName"></slot>
</div>
</template>组件的 slot 可以给 无限的 name,给了name之后就可以指定那个位置的插槽
slot 如何传值出去
父组件
<template>
<div>
<span>我是父级组件</span>
<hr>
<ChildrenCom>
<template v-slot:hasName="childrenValue">
<span>我是插槽 hasName</span>
<span>{{ childrenValue }}</span>
</template>
</ChildrenCom>
</div>
</template>子组件
<template>
<div>
<!-- 默认插槽 -->
<slot></slot>
<!-- 默认插槽 (可以省略的) -->
<slot name="default"></slot>
<!-- 指定插槽 -->
<slot name="hasName"></slot>
<!-- 指定插槽 可以传值 -->
<slot name="hasName" :value="value"></slot>
</div>
</template>
<script>
export default {
data() {
return {
value: '我是插槽传值'
}
},
}
</script>
<style lang="less" scoped>
</style>
输出结果:

从上面的代码可以看出来,我们使用 v-bind 也就是 :给 slot 传一个值,就可以传到外面,
那么父级的接收就是通过 v-slot:xxx=value ,value 是任意名字。
从上面的图里可以看到,我们拿到的值是一个对象,我们可以顺便解构出来,省一点事
<template v-slot:hasName="{value}">那么我们渲染就简单了
<span>{{ value }}</span>这样就可以了。
这你讲解一下为什么拿到的值是一个对象,因为我们可以同时传多个参数,像这样
父组件
<template>
<div>
<span>我是父级组件</span>
<hr>
<ChildrenCom>
<!-- 解构接收的参数 -->
<template v-slot:hasName="{value,parameter}">
<span>我是插槽 hasName</span>
<span>{{ value }}</span>
<span>{{ parameter }}</span>
</template>
</ChildrenCom>
</div>
</template>子组件
<template>
<div>
<!-- 默认插槽 -->
<slot></slot>
<!-- 默认插槽 (可以省略的) -->
<slot name="default"></slot>
<!-- 指定插槽 -->
<slot name="hasName"></slot>
<!-- 指定插槽 可以传值 -->
<slot name="hasName" :value="value" :parameter="parameter"></slot>
</div>
</template>
<script>
export default {
data() {
return {
value: '我是插槽传值',
parameter: '我是额外的参数'
}
},
}
</script>
<style lang="less" scoped>
</style>
如上所示,这样就可以拿到 N 个参数值,以便灵活处理特殊情况。