v-slot
v-slot 用法: v-slot:slotname 缩写: #slotname
(old) slot 用法: slot="slotname"
v-slot 指令。目的就是想统一 slot 和 slot-scope 语法,使代码更加规范和清晰。既然有新的语法上位,很明显,slot 和 scope-slot 也将会在 vue@3.0.x 中彻底的跟我们说拜拜了。而从 vue@2.6.0 开始,官方推荐我们使用 v-slot 来替代后两者。
- 跟 v-on 和 v-bind 一样,v-slot 也有缩写,即把参数之前的所有内容 (v-slot:) 替换为字符 #。
- 例如 v-slot:header 可以被重写为 #header:
老的写法 子组件(slotOne1)
//子组件(slotOne1)
<template>
<div class="slotOne1">
<slot></slot>
</div>
</template>
//在子组件中写入slot,slot所在的位置就是父组件要显示的内容
//父组件
<template>
<div>
<slotOne1>
<p style="color:red">我是父组件插槽内容</p>
</slotOne1>
</div>
</template>
用v-slot实现(新的方法)
//子组件(slotOne1)
<template>
<div class="slotOne1">
<div>我是slotOne1组件</div>
<slot></slot>
</div>
</template>
//父组件
<template>
<div>
// 当然也可以不写v-slot:default 直接<slotOne1>
<slotOne1 v-slot:default>
<p style="color:red">我是父组件插槽内容</p>
</slotOne1>
</div>
</template>
具名插槽
老的写法
- 子组件
<template>
<div class="slottwo">
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
</template>
在子组件中定义了三个slot标签,其中有两个分别添加了name属性header和footer
- 父组件
<template>
<div>
我是父组件
<slot-two>
<p>啦啦啦,啦啦啦,我是卖报的小行家</p>
<template slot="header">
<p>我是name为header的slot</p>
</template>
<p slot="footer">我是name为footer的slot</p>
</slot-two>
</div>
</template>
- 在父组件中使用template并写入对应的slot值来指定该内容在子组件中现实的位置
- 当然也不用必须写到template ,没有对应值的其他内容会被放到子组件中没有添加name属性的slot中
新的写法
子组件(slotTwo)
<template>
<div class="slottwo">
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
</template>
在子组件中定义了三个slot标签,其中有两个分别添加了name属性header和footer
- 父组件
<template>
<div>
我是 父 组件
<slot-two>
<template #header>
<p>我是name为header的slot</p>
</template>
//<p>啦啦啦,啦啦啦,我是卖报的小行家</p> // 不用template标签也可以 会添加到默认插槽中
<template #default>
<p>啦啦啦,啦啦啦,我是卖报的小行家</p>
</template>
// 请注意, v-slot 只能添加到 <template> 或自定义组件上,这点与弃用的 slot 属性不同
// 这里使用了缩写# v-slot的缩写是#
//<p #footer>我是name为footer的slot</p> 不能这样写
// 要这样写
<template #footer>
<p>我是name为footer的slot</p>
</template>
</slot-two>
// 或者用以下的格式
<slot-two>
<template v-slot:header>
<p>我是name为header的slot</p>
</template>
<template v-slot:default>
<p>啦啦啦,啦啦啦,我是卖报的小行家</p>
</template>
<template v-slot:footer>
<p>我是name为footer的slot</p>
</template>
</slot-two>
</div>
</template>
- 请注意, v-slot 只能添加到 < template > 或自定义组件上,这点与弃用的 slot 属性不同 v-slot:的缩写是 #
- 还有就是要么都用v-slot: 要么都用缩写 # ,不要混合用,要不然只有最后面的才生效
- 在父组件中使用template并写入对应的slot值来指定该内容在子组件中现实的位置
- 当然也不用必须写到template ,没有对应值的其他内容会被放到子组件中没有添加name属性的slot中