基于element-ui table组件的二次封装

news2025/1/22 12:24:59

文章目录

    • 配置数据基础分析
    • 封装 el-table-column
    • 使用插槽强化
    • 结语

相信 element-ui 大家都有所耳闻,table 也是老朋友了,不过在使用它的时候大家是怎么使用的呢?是直接在官网上cv使用吗?这种方式,我相信写起来会有点小难受,反正我感觉要是一共表格就cv一次,对于我来说是有点难受的,但是如果这个 table 表格可以通过一个 json 这种类似的格式进行配置,会不会方便很多呢

配置数据基础分析

  1. 直接复制官网的案例使用 table 组件,会让我们页面的代码增加不说,还会变得不是那么好维护,每次增加删除或者修改,都需要在结构里面去找,而且这种看起来差不多的配置,肯定是能动态生成的话就动态生成,毕竟都是 “懒人”

  2. 开头提到过,通过 json 配置生成,那应该怎么确定这个 json 配置呢?我们不妨写看看官网的案例示例代码,如图:
    在这里插入图片描述

  3. 可以看到,其实一个列需要的基础属性是 prop 和 label,prop 实现数据的填充,label 就负责表头的显示,所以我们配置的数据,只收应该具备什么,是不是 prop 和 label 呢?所以我们可以写出一个基础的配置数据,如下:

    const tableColConfig = [
    	{ prop: 'date', label: '日期' },
    	{ prop: 'name', label: '姓名' },
    	{ prop: 'address', label: '地址' }
    ]
    
  4. 这个数据只是最基础的,后续讲解会继续扩展

封装 el-table-column

  1. 有了数据之后,我们应该怎么封装,才能通过数据动态生成呢?像这种渲染结构,我们首先想到的必然就是 v-for,也确实如此,所以我们先创建一个 vue 文件来进行封装,如下:

    <template>
    	<el-table
    		:border="border"
    		:data="tableData">
    		<!-- 通过 tableColConfig 进行循环渲染 -->
    		<el-table-column
    			v-for="item in tableColConfig"
    			:key="item.prop"
    			:prop="item.prop"
    			:label="item.label"></el-table-column>
    	</el-table>
    </template>
    
    <script>
    export default {
    	props: {
    		// 实际显示的表格数据
    		tableData: {
    			type: Array,
    			default: () => []
    		},
    		// 配置表格的数据
    		tableColConfig: {
    			type: Array,
    			default: () => []
    		},
    		// 是否显示边框
    		border: {
    			type: Boolean,
    			default: true
    		}
    	}
    }
    </script>
    
    <style scoped></style>
    
  2. 有没有发现我这里多写了一个 border 属性呢,这个属性是来控制 el-table 组件是否展示边框的,有这个配置项的话,那我们的配置文件也需要响应的增加一下,如下:

    // 表格列配置
    const tableColConfig = [
    	{ prop: 'date', label: '日期' },
    	{ prop: 'name', label: '姓名' },
    	{ prop: 'address', label: '地址' }
    ]
    
    export default {
    	tableColConfig,
    	border: true
    }
    
  3. 看起来是不是感觉非常简单呢?那封装好了这个组件之后,我们还需要实际的来使用一下,如下:

    <template>
    	<div class="container">
    		<div class="table-box">
    			<!-- v-bind 可以批量绑定属性 -->
    			<JcTable
    				:tableData="tableData"
    				v-bind="tableConfig"></JcTable>
    		</div>
    	</div>
    </template>
    
    <script>
    import JcTable from '@/components/JcTable/index.vue'
    import tableConfig from '@/config/table.config'
    
    export default {
    	components: { JcTable },
    
    	data() {
    		return {
    			tableData: [
    				{
    					date: '2016-05-02',
    					name: '王小虎',
    					address: '上海市普陀区金沙江路 1518 弄'
    				},
    				{
    					date: '2016-05-04',
    					name: '王小虎',
    					address: '上海市普陀区金沙江路 1517 弄'
    				},
    				{
    					date: '2016-05-01',
    					name: '王小虎',
    					address: '上海市普陀区金沙江路 1519 弄'
    				},
    				{
    					date: '2016-05-03',
    					name: '王小虎',
    					address: '上海市普陀区金沙江路 1516 弄'
    				}
    			],
    			tableConfig
    		}
    	}
    }
    </script>
    
    <style scoped>
    .container {
    	width: 100vw;
    	height: 100vh;
    	display: flex;
    	justify-content: center;
    	align-items: center;
    }
        
    .table-box {
    	width: 50%;
    	height: 400px;
    }
    </style>
    
  4. 关于这个 v-bind 这里不做赘述了,有兴趣的大家可以自行点击跳转到文档查看

  5. 写了这么多,也到了看一眼效果的时候了,也不能光画饼不给吃是不,如图:

    在这里插入图片描述

  6. 当我们进行了一次封装之后,后续使用这个表格组件就变得非常的简单了

使用插槽强化

  1. 上面实现了一个基础的使用,但是很明显无法满足我们常规的开发需求,这样封装之后,我如果需要再每行加一个按钮呢?或者我需要单独给某一列添加其他dom呢?这些应该怎么解决,比如在官网中的案例效果,如图:

    在这里插入图片描述

  2. 这种情况在开发中使用 el-table 是非常常见的,而让一个组件在某个位置可以让我们自由编辑替换,大家想到了什么,是不是插槽呢?就是插槽了,关于插槽这里也不做赘述了,而这么多列,我应该怎么才能让我的内容放入到指定的位置中呢?一一对应不难想到,具名插槽

  3. 现在我们已经知道可以通过具名插槽来解决这个问题了,应该如何在渲染的列的时候,动态的添加在我们封装的组件中呢?这时候最开始的配置已经无法满足我们的需求了,还需要一个属性 slotName,当配置的数据中,存在 slotName 时,就使用具名插槽,插槽的名字就是 slotName属性的值,修改的数据如下:

    const tableColConfig = [
    	{ prop: 'date', label: '日期' },
    	{ prop: 'name', label: '姓名', slotName: 'name' },
    	{ prop: 'address', label: '地址' },
    	{ prop: 'operate', label: '地址', slotName: 'operate' }
    ]
    
  4. 在修改封装的组件前,我们不妨先看看再案例中,是如何修改这部分的,如下:

    在这里插入图片描述

  5. 可以看到,通过这种方式,就可以从el-tale组件中获取到该列中每个单元格对应的值,并且可以在这个范围内自定义的书写dom,所以结合插槽,我们就可以写出如下的代码:

    <template>
    	<el-table
    		:border="border"
    		:data="tableData">
    		<el-table-column
    			v-for="item in tableColConfig"
    			:key="item.prop"
    			:prop="item.prop"
    			:label="item.label">
    			<!-- 如果存在 slotName 属性,则加入动态插槽 -->
    			<template #default="scope">
    				<template v-if="item.slotName">
    					<slot
    						:name="item.slotName"
    						:row="scope.row"></slot>
    				</template>
    				<template v-else>
    					<span>{{ scope.row[item.prop] }}</span>
    				</template>
    			</template>
    		</el-table-column>
    	</el-table>
    </template>
    
    <script>
    export default {
    	props: {
    		// 实际显示的表格数据
    		tableData: {
    			type: Array,
    			default: () => []
    		},
    		// 配置表格的数据
    		tableColConfig: {
    			type: Array,
    			default: () => []
    		},
    		// 是否显示边框
    		border: {
    			type: Boolean,
    			default: true
    		}
    	}
    }
    </script>
    
    <style lang="less" scoped></style>
    
  6. 只是增加了一个if判断,还是比较好理解的,那么增加这个之后,我们只需要按照正常使用插槽的方式使用即可,如下:

    <template>
    	<div class="container">
    		<div class="table-box">
    			<JcTable
    				:tableData="tableData"
    				v-bind="tableConfig">
    				<!-- 使用插槽 -->
    				<template #name="{ row }">
    					<span style="color: #f40">{{ row }}</span>
    				</template>
    
    				<template #operate>
    					<el-button type="primary">操作</el-button>
    				</template>
    			</JcTable>
    		</div>
    	</div>
    </template>
    
  7. 我们来看看现在显示效果,如图:

    在这里插入图片描述

  8. 在页面的显示中,我们已经可以拿到当前行的数据,具体怎么使用,那就是根据业务自己进行实现了

结语

  1. 使用插槽之后,就已经可以满足日常的基本使用了,如果你还需要其他的需求,可以在此基础上进行扩展
  2. 比如序列号,勾选状态等等,亦或者和其他组件配合,再次封装为一个组件,通过这种分层的思想,可以解决很多业务的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1344325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件

哈喽大家好&#xff01;你有没有需要适用于电脑的免费数据恢复软件呢&#xff1f;数据丢失可是个烦心事&#xff0c;无论是硬件故障还是软件损坏&#xff0c;甚至是意外删除、格式化或计算机病毒&#xff0c;都让人郁闷至极。当你遇到数据丢失的情况时&#xff0c;你一定希望能…

基于huffman编解码的图像压缩算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Huffman编码算法步骤 4.2 Huffman编码的数学原理 4.3 基于Huffman编解码的图像压缩 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..…

在Linux上搭建Maven仓库的实战教程

引言 在Java开发中&#xff0c;Maven作为项目构建和依赖管理的重要工具&#xff0c;其仓库的搭建至关重要。本文将手把手教你如何在Linux系统上安装并配置Nexus Repository Manager 3&#xff08;简称Nexus 3&#xff09;&#xff0c;从而创建一个私有的Maven仓库。 步骤一&a…

浅谈水下起重顶升作业使用千斤顶的可能性

并非所有起重顶升的施工环境全为常规环境&#xff0c;除了传统的陆上作业之外&#xff0c;难免也会有一些特殊环境下的起重顶升任务&#xff0c;其中比较典型的自然是水下起重顶升作业&#xff0c;那么千斤顶究竟能在水下进行起重顶升作业吗&#xff1f;接下来成华制造来给大家…

04-获取认证的用户身份信息

存储用户信息的方式 获取用户信息的流程 用户提交账号和密码后,DaoAuthenticationProvider调用UserDetailsService接口实现类的loadUserByUsername()方法,该方法可以接收请求参数username的值,然后根据该值查询用户信息,最后将账号,密码,权限封装到UserDetails对象中并返回给…

I.MX6ULL_Linux_驱动篇(51)linux 音频驱动

音频是我们最常用到的功能&#xff0c;音频也是 linux 和安卓的重点应用场合。 I.MX6ULL 带有 SAI接口&#xff0c;正点原子的 I.MX6ULLALPHA 开发板通过此接口外接了一个 WM8960 音频 DAC 芯片&#xff0c;本章我们就来学习一下如何使能 WM8960 驱动&#xff0c;并且通过 WM89…

flask之文件管理系统-项目 JRP上线啦!!! ---修订版,兼容Windows和Linux系统

上一章的版本https://blog.csdn.net/weixin_44517278/article/details/135275066&#xff0c;在Windows下debug完成无异常后&#xff0c;上传到我的树莓下开始正式服役 由于开发环境是Windows&#xff0c;使用环境是Linux&#xff0c;导致最后没能成功运行起来 这个版本是今天去…

Elasticsearch:升级索引以使用 ELSER 最新的模型

在此 notebook 中&#xff0c;我们将看到有关如何使用 Reindex API 将索引升级到 ELSER 模型 .elser_model_2 的示例。 注意&#xff1a;或者&#xff0c;你也可以通过 update_by_query 来更新索引以使用 ELSER。 在本笔记本中&#xff0c;我们将看到使用 Reindex API 的示例。…

【Linux C 几种锁的性能对比】 1.读写锁 2.互斥锁 3.自旋锁 4.信号量 5.rcu

直接上代码 rcu.c #include <stdio.h> #include <stdlib.h> #include <unistd.h>#include <pthread.h> #include <limits.h> #include <semaphore.h> #include <urcu.h>/* 1.读写锁2.互斥锁3.自旋锁4.信号量5.rcu */#define RW_LOC…

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践 一、需求二、上传本地 Git 仓库2.1 初始版本2.2 优化版本 三、 GitHub 创建空仓库3.1 初始版本3.2 优化版本 四、Gitee 创建空仓库 一、需求 app目录下的每个文件夹都是一个git仓库&#xff0c;如何使用shell脚本将所有gi…

Python/R/GUI/BI类型常用数据可视化工具

什么是数据可视化工具&#xff1f; 数据可视化工具是指旨在可视化数据的所有形式的软件。它们处理数据输入&#xff0c;将其转换为用户可以根据自己的需求进行定制的视觉效果。 不同的工具可以包含不同的功能&#xff0c;但最基本的是&#xff0c;数据可视化工具提供输入数据集…

交叉编译含义

交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统&#xff1b;同样&#xff0c;同一个操作系统也可以在不同的体系结构上运行。 编译工具链下载&#xff1a; (1) ARM提供&#xff1a;Arm GNU Toolchain Downloads – Arm Develope…

GroundingDINO-根据文本提示检测任意目标

1. 背景介绍 GroundingDINO是一种新的SOTA零样本物体检测模型。在这篇文章中&#xff0c;我们将讨论Grounding DINO模型的优势&#xff0c;分析其具体的模型架构&#xff0c;并提供真实的测试样例。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2.零样本目标检测 大多…

Python实现员工管理系统(Django页面版 ) 七

各位小伙伴们好久不见&#xff0c;2024年即将到来&#xff0c;小编在这里提前祝大家新的一年快快乐乐&#xff0c;能够事业有成&#xff0c;学习顺心&#xff0c;家庭和睦&#xff0c;事事顺利。 今天我们本篇要实现的是一个登录界面的实现&#xff0c;其实登录界面的实现看着挺…

php学习06-魔术常量

有九个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 LINE 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写&#xff0c;如下&#xff1a; 参考

SpringBoot知识

1、Spring和SpringBoot对比 2、版本调整 &#xff08;1&#xff09;先排除是否是JDK与SpringBoot的版本不一致导致的&#xff1a;如JDK1.8和SpringBoot3.1.5冲突&#xff1b; &#xff08;2&#xff09;调整编译版本 &#xff08;3&#xff09;调整maven的jdk &#xff08;4&…

AI又进化了,AI 写代码工具

今年 AI 的发展可谓一日千里&#xff0c;相信不少同学应该都用过 AI 来帮助自己提高开发效率吧&#xff1f; 比如让 AI 根据注释生成代码、解释整段代码、提供技术问题的答疑、修改 Bug、生成单元测试等等。 在 12 月 28 日刚刚结束的 WAVE SUMMIT 深度学习开发者大会上&…

引领手游技术潮流:武汉灰京文化的卓越技术创新与市场推广支持

在数字娱乐领域&#xff0c;手游行业正蓬勃发展&#xff0c;为数以亿计的玩家提供了丰富的娱乐选择。武汉灰京文化&#xff0c;作为该领域的佼佼者&#xff0c;以其强大的技术创新和全面的市场推广支持&#xff0c;为合作伙伴的成功铺平了道路&#xff0c;不仅提升了游戏质量&a…

Amlogic HDMI驱动分析

目录 一、简介 二、代码结构介绍 三、HDMI资料 四、宏观认识一下HDMI 1、硬件连接 2、Amlogic方案中HDMI的位置 3、Amlogic HDMI驱动模块的划分 五、HDMI-RX驱动分析 1、芯片手册解读 2、RX -makefile 3、驱动模型分析 4、RX的运行 5、HDMI RX调试 六、HDMI-TX驱…