本文深入解析Vue中插槽的核心用法,涵盖匿名插槽的基础定义、后备内容的默认值机制、具名插槽的多区域布局以及作用域插槽的数据传递。通过具体代码示例,展示如何灵活利用slot实现组件内容分发与数据交互,帮助开发者掌握Vue组件化开发的关键技术。
一、前言
插槽可视为组件内部的占位符。在使用组件时,将需要插入组件标签体内的DOM结构写入组件标签内部即可实现内容分发。
通俗理解,插槽是在自定义组件中预留的一个位置,该位置的内容由调用组件的用户自行定义。通过属性等数据支持动态内容展示与交互,具备极高的灵活性。
二、匿名插槽
在定义组件时,需在用户自定义区域使用作为占位符;在使用组件时,通过标签在组件标签之间定义要填充到插槽的内容。具体示例代码如下:
定义组件
若定义组件时未使用占位,即使在使用组件时在标签间定义了内容,这些内容也会被忽略。
//定义一个组件Box
<template>
<div>
<div>这是一个定义了插槽的组件</div>
<slot></slot>
<div>组件其它内容</div>
</div>
</template>使用组件
//使用上面的组件
<Box>
<template>
<div>插槽中展示的内容</div>
</template>
</Box>对应关系

三、后备内容
此处提到的后备内容即官方文档中的默认值概念。在定义组件时,可在标签内部提供插槽的默认内容。当使用插槽且未在组件标签内定义具体插槽内容时,默认内容生效;否则默认内容不显示。例如:
定义组件插槽设置默认内容
//定义一个组件Box
<template>
<div>
<div>这是一个定义了插槽的组件</div>
<!-- 通过slot定义了一个插槽,并在插槽中给出了默认值 -->
<slot>
<div>这是插槽的默认内容</div>
</slot>
<div>组件其它内容</div>
</div>
</template>不使用默认值,覆盖
<Box>
<template>
<div>插槽中展示的内容</div>
</template>
</Box>此时页面呈现的内容为:

使用默认值
<Box></Box>此时页面呈现的内容为:

四、具名插槽(命名插槽)
每个插槽均拥有名称。当组件仅包含一个插槽时,无需指定名称,此时默认名称为。若组件包含多个插槽,必须为每个插槽指定唯一名称,否则无法准确填充对应内容。
在组件定义中为slot设置name属性,使用组件时通过指定插入目标插槽。v-slot必须应用于template标签,且可简写为,推荐使用简写形式。示例如下:
定义组件
<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标识插槽名称,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>效果展示

以上即为Vue中插槽具体使用的完整解析,更多关于Vue插槽的资料可关注本站其他相关文章!