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

文章目录

    • 配置数据基础分析
    • 封装 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. 比如序列号,勾选状态等等,亦或者和其他组件配合,再次封装为一个组件,通过这种分层的思想,可以解决很多业务的问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023启示录丨自动驾驶这一年

图片&#xff5c;《老人与海》插图 过去的20年&#xff0c;都没有2023年如此动荡。 大模型犹如一颗原子弹投入科技圈&#xff0c;卷起万里尘沙&#xff0c;传统模式瞬间被夷为平地&#xff0c;在耀眼的白光和巨大的轰鸣声之下&#xff0c;大公司、创业者、投资人甚至是每一位观…

裕泰微YT8521SH PHY芯片在uboot下的代码适配(一)

文章目录 支持的工作模式自协商模式下改变 PHY 支持的速度和双工能力 RGMII 配置通过 POS 设置 RX_delay通过寄存器加长 RX_delayTX_delay 的设置驱动能力的设置 LED 灯配置硬件电路设计相关问题快速上下电的要求上电复位时序要求 YT8521SC/SH 是一款单口千兆以太网 PHY。 支持…

OSPF ROUTER-ID-新版(15)

目录 整体拓扑 操作步骤 1.INT 验证Router-ID选举规则 1.1 查看路由器Router-ID 1.2 配置R1地址 1.3 查看R1接口信息 1.4 查看R1Router-ID 1.5 删除接口IP并查看Router-ID 1.6 手工配置Router-ID 2.基本配置 2.1 配置R1的IP 2.2 配置R2的IP 2.3 配置R3的IP 2.4 配…

数据库管理-第128期 2023总结(202301229)

数据库管理-第128期 2023总结&#xff08;202301229&#xff09; 到了2023年的最后一个工作日&#xff0c;也该对即将过去的2023年做一个小小的总结&#xff1a; 1 写文章 2023年在CSDN总共写了82篇文章。 2023年4月开始在墨天轮写文章&#xff0c;总共写了75篇文章&#xf…

电子工程师如何接私活赚外快?

对电子工程师来说&#xff0c;利用业余时间接私活是个很常见的技术&#xff0c;不仅可以赚取额外收入&#xff0c;也能提升巩固技术&#xff0c;可以说国内十个工程师&#xff0c;必有五个在接私活养家糊口&#xff0c;如果第一次接私活&#xff0c;该如何做&#xff1f; 很多工…

基于Springboot+vue医院管理系统(前后端分离)

最近有一些读者问我有没有完整的基于SpringbootVue的项目源码&#xff0c;今天给大家整理了一下&#xff0c;无偿分享给大家。 功能&#xff1a; 医生信息管理 换着信息管理 挂号信息管理 药物信息管理 检查项目管理 病床信息管理 排班信息管理 数据统计分析 开发工具…

基于低代码的指尖遐想_1

解决问题或分析事务的思考方法&#xff1a; 1、什么是低代码&#xff0c;或者说现在的低代码能做什么&#xff0c;未来能做什么&#xff0c;其存在的合理性是什么&#xff1f; 回答这个问题的本质是搜集信息&#xff0c;公开的或非公开的。 答&#xff1a;低代码主要分为广义…

视频号三年:质疑红利,理解红利,抄底红利

“去年刚进来时&#xff0c;视频号带货配套都还不成熟&#xff0c;团队都不熟悉后台操作&#xff0c;硬是磨合了一个多月&#xff0c;也做好了亏钱的准备。不过前两天刚算了帐&#xff0c;今年 GMV 已经比去年翻了两番。” “22年想靠投流起号&#xff0c;但每次投流计划基本消…

地震烈度速报与预警工程成功案例的经验分享 | TDengine 技术培训班第一期成功落地

近日&#xff0c;涛思数据在成都开设了“国家地震烈度速报与预警工程数据库 TDengine、消息中间件 TMQ 技术培训班”&#xff0c;这次培训活动共分为三期&#xff0c;而本次活动是第一期。其目标是帮助参与者深入了解 TDengine 和 TMQ 的技术特点和应用场景&#xff0c;并学习如…

geemap学习笔记037:分析地理空间数据--坐标格网和渔网

前言 坐标格网&#xff08;Coordinate Grid&#xff09;简称“坐标网”&#xff0c;是按一定纵横坐标间距&#xff0c;在地图上划分的格网&#xff0c;坐标网是任何地图上不可缺少的要素之一。下面将详细介绍一下坐标格网和渔网。 1 导入库并显示地图 import ee import geem…

node 项目中 __dirname / __filename 是什么,为什么有时候不能用?

__dirname 是 Node.js 中的一个特殊变量&#xff0c;表示当前执行脚本所在的目录的绝对路径。 __filename 同理&#xff0c;是 Node.js 中的一个特殊变量&#xff0c;表示当前执行脚本的绝对路径&#xff0c;包括文件名。 在 Node.js 中&#xff0c;__dirname / __filename是…

springboot系列——IDEA创建项目并运行

springboot Spring Boot是为了简化Spring应用程序的开发和部署而产生的。 Spring Boot提供了一种基于约定优于配置的开发模式。它自动配置了Spring应用程序所需的各种组件和依赖&#xff0c;并提供了简单易用的命令行工具来构建和运行应用程序。 Spring Boot还提供了一套开箱…

SeaTunnel流处理同步MySQL数据至ClickHouse

ClickHouse是一种OLAP类型的列式数据库管理系统&#xff0c;ClickHouse完美的实现了OLAP和列式数据库的优势&#xff0c;因此在大数据量的分析处理应用中ClickHouse表现很优秀。 SeaTunnel是一个分布式、高性能、易扩展、用于海量数据同步和转化的数据集成平台。用户只需要配置…

最快速度与最简代码搭建卷积神经网络,并快速训练模型,每日坚持手撕默写代码

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下最快速度与最简代码搭建卷积神经网络&#xff0c;并快速训练模型&#xff0c;每日坚持手撕默写代码。随着人工智能的快速发展&#xff0c;去年有强大的大模型ChatGPT横空出世&#xff0c;国内的大模型也紧追其后的发…

用于IT管理的COBIT

随着世界的不断发展和变化&#xff0c;企业必须像冲浪者一样乘风破浪&#xff0c;适应社会不断更新的浪潮&#xff0c;拥抱新技术。信息技术&#xff08;IT&#xff09;已成为大多数企业运营的支柱&#xff0c;对战略决策、客户互动和整体效率都起了一定的影响作用。然而&#…

三巨头对决:深入了解pnpm、yarn与npm

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 三巨头对决&#xff1a;深入了解pnpm、yarn与npm 前言包管理器简介npm&#xff08;Node Package Manager&#xff09;&#xff1a;Yarn&#xff1a;pnpm&#xff08;Performant Npm&#xff09;&#…

基于ssm学生奖惩管理系统+v论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对学生奖惩信息管理的提升&#x…

PowerShell Instal 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…

C语言 linux文件操作(二)

文章目录 一、获取文件长度二、追加写入三、覆盖写入四、文件创建函数creat 一、获取文件长度 通过lseek函数&#xff0c;除了操作定位文件指针&#xff0c;还可以获取到文件大小&#xff0c;注意这里是文件大小&#xff0c;单位是字节。例如在file1文件中事先写入"你好世…

智慧工地云平台源码 支持二次开发、支持源码交付

智慧工地利用移动互联、物联网、云计算、大数据等新一代信息技术&#xff0c;彻底改变传统施工现场各参建方的交互方式、工作方式和管理模式&#xff0c;为建设集团、施工企业、监理单位、设计单位、政府监管部门等提供一揽子工地现场管理信息化解决方案。 通过人员管理、车辆管…