vue插槽的使用(匿名插槽、后备内容、具名插槽、作用域插槽)
一、前言
- 插槽就像放在组件中的占位标签,使用组件时我们将要放到占位标签处的DOM结构写入组件标签体中即可。
- 通俗点来讲,插槽就是在自定义组件中预留一个位置,这个位置的内容可以由使用组件的人来定义,可以通过属性等数据实现动态的内容展示及交互,具有高度的灵活性,。
二、匿名插槽
定义组件时,在需要由用户自定义的区域使用<slot></slot>
占位,使用组件时,在组件的标签之间通过<template></template>
定义要往插槽中填充的内容。示例代码:
定义组件
如果在定义组件时没有使用<slot></slot>
占位,即使在使用组件时在组件标签之间定义了内容,也会被忽略。
//定义一个组件Box
<template>
<div>
<div>这是一个定义了插槽的组件</div>
<slot></slot>
<div>组件其它内容</div>
</div>
</template>
使用组件
//使用上面的组件
<Box>
<template>
<div>插槽中展示的内容</div>
</template>
</Box>
对应关系
三、后备内容
此处所说的后备内容是官方文档里面的叫法,实际上就是指插槽的默认值。在定义组件时,可以在<slot><slot>
之间给出插槽的默认内容,也就是说当使用插槽时如果没有在组件标签内定义插槽的内容,则默认内容生效,否则默认内容不生效。例如:
定义组件插槽设置默认内容
//定义一个组件Box
<template>
<div>
<div>这是一个定义了插槽的组件</div>
<!-- 通过slot定义了一个插槽,并在插槽中给出了默认值 -->
<slot>
<div>这是插槽的默认内容</div>
</slot>
<div>组件其它内容</div>
</div>
</template>
不使用默认值,覆盖
<Box>
<template>
<div>插槽中展示的内容</div>
</template>
</Box>
此时页面呈现的内容为:
使用默认值
<Box></Box>
此时页面呈现的内容为:
四、具名插槽(命名插槽)
每个插槽都有一个名字,当一个组件中只有一个插槽时,我们可以不用指定插槽的名称,此时插槽的名称为:default。如果一个组件中有多个插槽,我们必须为每个插槽制定名称,否则无法向插槽填充对应的内容。
在组件定义时为solt制定name属性
,使用组件时,通过v-slot:插槽名称
,指定插入到哪个插槽。v-slot必须使用在template标签上
,v-slot:插槽名称可以简写为#插槽名称
,推荐使用简写。示例:
定义组件
<template>
<div class="box">
<span>我是组件的内容</span>
<div class="slots">
<!-- 定义名字为left的插槽 -->
<div class="left">
<slot name="left"></slot>
</div>
<!-- 定义名字为center的插槽 -->
<div class="center">
<slot name="center"></slot>
</div>
<!-- 定义名字为right的插槽 -->
<div class="right">
<slot name="right"></slot>
</div>
</div>
<div>组件其他内容</div>
</div>
</template>
使用组件
<Box>
<!-- 使用v-slot:插槽名字 -->
<template v-slot:left>
我是left插槽的内容
</template>
<!-- 使用#插槽名字 -->
<template #center>
我是center插槽的内容
</template>
<template #right>
我是right插槽的内容
</template>
</Box>
效果展示
五、作用域插槽
定义组件Box
定义组件时为slot增加了name和data属性,name为slot的名称
,data为自定义属性
。
<template>
<div class="box">
<span>我是组件的内容</span>
<div class="slotBox">
<slot name="slotBox1" :data="list"></slot>
<slot name="slotBox2" :data="list"></slot>
</div>
<div>组件其他内容</div>
</div>
</template>
<script>
export default {
name: "slotPiece",
data() {
return {
list: [{
txt: '内容1',
id: 1
}, {
txt: '内容2',
id: 2
}, {
txt: '内容3',
id: 3
}, {
txt: '内容4',
id: 4
}]
};
},
}
</script>
使用组件
使用组件时template标签中指令:#slotBox1="data"
,其中#slotBox1是:v-slot:slotBox1的缩写
,data中包含了data属性值,使用时可以通过data.data
或{ data }
解构数据获取传过来的消息内容,对其进行渲染或修改等操作。
<Box>
<template #slotBox1="data">
<!-- 接收过来不解构为下面的结构: -->
<div>
<div>我是不解构的数据</div>
{{ data }}
</div>
<!-- 通过属性取值: -->
<div>
<div>通过属性取值</div>
{{ data.data }}
</div>
</template>
<!-- 通过{ }结构数据 -->
<template #slotBox2="{ data }">
<div>
<div>我是解构后的数据</div>
{{ data }}
<div>使用或修改数据</div>
<div v-for="hl in data">内容:{{ hl.txt }}</div>
</div>
</template>
</Box>
效果展示
转载自:https://juejin.cn/post/7244346901126414393