Vue插槽详解:从匿名、具名到作用域插槽的完整指南

作者:小布丁

时间:2026-10-31

浏览:236

本文深入解析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插槽的资料可关注本站其他相关文章!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章