当前位置: 首页 > news >正文

Vue2 插槽 Slot

提示:插槽的目的是让我买原来的设备具备更多的扩展性。

文章目录

  • 前言
  • 在组件中定义插槽(子组件视角)
    • 1. 默认插槽
    • 2. 具名插槽(带名称的插槽)
    • 3. 作用域插槽(带数据的插槽)
  • 使用插槽(父组件视角)
    • 1. 使用默认插槽
    • 2. 使用具名插槽(案例解析)
    • 3. 使用作用域插槽
  • JeecgBoot 案例深度解析
    • 原代码片段:
    • 实现机制:
  • 完整示例:带作用域的表格组件
    • 子组件定义:
    • 父组件使用:
  • 插槽与 Props 的对比
  • 最佳实践建议


前言

提示:这里可以添加本文要记录的大概内容:

插槽用于组件内容分发,实现父组件向子组件传递模板内容

插槽(Slot) 是 Vue 组件化开发中用于内容分发的机制,它允许父组件向子组件传递模板片段,实现组件内容的动态组合。通过插槽可以实现:

  1. 内容定制:父组件可自定义子组件的部分内容
  2. 结构复用:保持组件核心逻辑的同时提供布局灵活性
  3. 作用域控制:子组件可向插槽传递数据(作用域插槽)

在组件中定义插槽(子组件视角)

1. 默认插槽

<!-- 子组件 ChildComponent.vue -->
<template>
  <div class="container">
    <!-- 默认插槽位置 -->
    <slot>
      <!-- 默认内容(可选) -->
      <p>当父组件不提供内容时显示这个默认文本</p>
    </slot>
  </div>
</template>

2. 具名插槽(带名称的插槽)

<!-- 子组件 JSelectBizComponent.vue -->
<template>
  <a-col class="left">
    <!-- 具名插槽 -->
    <slot name="left">
      <!-- 默认内容 -->
      <a-select .../>
    </slot>
  </a-col>
</template>

3. 作用域插槽(带数据的插槽)

<!-- 子组件 ScopedComponent.vue -->
<template>
  <div>
    <slot name="item" 
          :itemData="internalData" 
          :index="currentIndex">
    </slot>
  </div>
</template>

使用插槽(父组件视角)

1. 使用默认插槽

<!-- 父组件 ParentComponent.vue -->
<child-component>
  <!-- 插入默认插槽的内容 -->
  <h2>自定义标题</h2>
  <p>自定义内容</p>
</child-component>

2. 使用具名插槽(案例解析)

<!-- 父组件使用 JSelectBizComponent -->
<j-select-biz-component>
  <!-- #left 对应子组件的 name="left" 插槽 -->
  <template #left>
    <!-- 覆盖默认的 a-select -->
    <a-input placeholder="自定义输入框" />
    <a-button type="primary">搜索</a-button>
  </template>
</j-select-biz-component>

3. 使用作用域插槽

<!-- 父组件使用 ScopedComponent -->
<scoped-component>
  <template #item="slotProps">
    <!-- 使用子组件传递的数据 -->
    <p>索引:{{ slotProps.index }}</p>
    <p>数据:{{ slotProps.itemData }}</p>
  </template>
</scoped-component>

JeecgBoot 案例深度解析

原代码片段:

<!-- JSelectBizComponent 组件 -->
<template>
  <a-col class="left">
    <slot name="left">
      <a-select ...></a-select>
    </slot>
  </a-col>
</template>

实现机制:

  1. 插槽定义:通过 <slot name="left"> 定义具名插槽
  2. 默认内容:当父组件不提供插槽内容时,显示 <a-select> 组件
  3. 插槽覆盖:父组件可以通过 #left 完全替换默认内容
  4. 样式控制:通过 CSS 类 .left 控制布局样式

完整示例:带作用域的表格组件

子组件定义:

<!-- SmartTable.vue -->
<template>
  <a-table :dataSource="data">
    <template v-for="col in columns" :slot="col.slotName">
      <slot :name="col.slotName" 
            :column="col" 
            :record="col.record" 
            :text="col.text">
      </slot>
    </template>
  </a-table>
</template>

父组件使用:

<smart-table :columns="columns">
  <template #action="scope">
    <a-button @click="handleEdit(scope.record)">编辑</a-button>
    <a-button @click="handleDelete(scope.record.id)">删除</a-button>
  </template>
  
  <template #status="scope">
    <a-tag :color="scope.text | statusColor">
      {{ scope.text | statusText }}
    </a-tag>
  </template>
</smart-table>

插槽与 Props 的对比

特性插槽(Slot)Props
内容类型模板片段(HTML/组件)数据(字符串/数字/对象等)
使用场景结构定制数据传递
作用域可使用子组件数据(作用域插槽)父组件单向传递
动态性中等

最佳实践建议

  1. 合理命名:使用语义化的插槽名称(如 #header#footer
  2. 默认内容:为常用插槽提供合理的默认实现
  3. 作用域控制:当需要子组件数据时使用作用域插槽
  4. 适度使用:避免过度使用插槽导致组件结构复杂化
  5. 样式隔离:通过 CSS Scoped 或 BEM 规范管理插槽样式

通过以上方式,可以充分利用 Vue 的插槽机制,构建出高复用性、灵活可定制的组件体系,这在类似 JeecgBoot 这类需要高度可配置性的后台管理系统中尤为重要。

相关文章:

  • Ethernet Protocol以太网协议
  • 爬虫中遇到的问题
  • Elixir语言的函数定义
  • 【家政平台开发(24)】营销推广模块开发全攻略
  • 前端-项目工程化(快速理解并会用)
  • 【教程】MacBook 安装 VSCode 并连接远程服务器
  • 在深度学习中,如何统计模型的 ​​FLOPs(浮点运算次数)​​ 和 ​​参数量(Params)
  • Tiktok 关键字 视频及评论信息爬虫(1) [2025.04.07]
  • 从GPU加速到深度学习革命 —— AlexNet论文概述
  • 面试题vue
  • Compose Multiplatform+Kotlin Multiplatfrom 第五弹跨平台 截图
  • 深度学习与神经网络 | 邱锡鹏 | 第四章学习笔记 神经网络
  • centos操作系统如何更换yum镜像源
  • git pull 和 git fetch
  • ffmpeg基础知识入门
  • 力扣Hot100题,刷题
  • 红黑树(Red-Black Tree)核心知识点与面试高频问题
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷十·混元大罗(91)混元无极破 NP - 旅行商问题(动态规划 + 状态压缩)
  • 遇到无法连接香港服务器可能是什么原因导致的呢
  • 安宝特应用 | 工业AR技术赋能高端制造领域验收流程数字化转型
  • 男子聚餐饮酒后身亡,同桌3人被判赔偿近20万元
  • 广西北流出现强降雨,1人被洪水冲走已无生命体征
  • 上海天文馆走进徐家汇书院,XR沉浸式天文科普体验再推力作
  • 光明日报社副总编辑薄洁萍调任求是杂志社副总编辑
  • 英国6月初将公布对华关系的审计报告,外交部:望英方树立正确政策导向
  • 湖北宜化拟斥资超32亿加价回购“弃子”,布局上游煤炭业务