elementPlus表格二次封装

为何要对element-plus表格进行二次封装?

  • 我们正常在开发项目中,表格的风格是一致的,但是表格或多或少会有些不同,有些是需要分页,有些是按钮功能不同,有些又需要加Tag,或者对时间进行格式化等。所有才有了对element-plus的二次封装。

优势

  1. 组件中集成表格、分页、loading、tag等功能。
  2. 统一项目表格整体风格。
  3. 快速将表格在分页与不分页间切换。
  4. 表格列可根据需求进行定制化。
  5. 可快速开发大量自定义表格。

例子

<ELTableclass="table":table-data="tableObject.tableData":columns="tableObject.columns":page-config="tableObject.pageConfig"@current-change="onCurrentTableChange"
><template #operate="{ scope }"><el-button size="small" @click="handleEdit(scope)">Edit</el-button><el-button size="small" type="danger" @click="handleDelete(scope)">Delete</el-button></template>
</ELTable>

参数

  • tableData 表格的数据
{tableData: any[];
}
  • columns 列配置
type TableColumnType = {prop: string;label: string;attrs?: any;slot?: boolean;tagList?: TagObjectType[];
};{columns: TableColumnType[];
};
  • pageConfig 页面配置
type PageConfigType = {pageSize: number,total: number,pagerCount?: number,currentPage: number,// eslint-disable-next-line no-unused-varshandleCurrentChange: (val: number) => void
};{pageConfig: PageConfigType;
}
  • currentChange 点击分页后的事件
 {currentPageChange: (val: number,oldVal: number) => void;}
  • 整体简单配置
<ELTableclass="table":table-data="tableObject.tableData":columns="tableObject.columns":page-config="tableObject.pageConfig"@current-change="onCurrentTableChange"
>
</ELTable>const tableObject = reactive<TableType>({columns: [{prop: 'date',label: 'Date',attrs: {width: 140}},{prop: 'alarm',label: '告警等级',attrs: {width: 100}}],pageConfig: {pageSize: 5,total: 100,pagerCount: 5,currentPage: 3,handleCurrentChange: (number: number) => {console.log('重新请求数据', number);}},tableData: [{date: '2016-05-03',alarm: '1'},{date: '2016-05-02',alarm: '4'}]
});

简单的例子

带分页表格 usePagination

  • 添加 usePaginnation后即可实现表格分页的功能,@current-change是当分页页面变化时的回调
<ELTableclass="table":table-data="tableObject.tableData":columns="tableObject.columns":page-config="tableObject.pageConfig"usePagination
>
</ELTable>const tableObject = reactive<TableType>({columns: [],pageConfig: {pageSize: 5,total: 100,pagerCount: 5,currentPage: 3,// 当前页发生变化时的回调handleCurrentChange: (number: number) => {tableObject.pageConfig.currentPage = number;console.log('重新请求当前页的数据数据', number);}},tableData: []
});

不带分页的表格

  • 不带分页的表格只需要将 usePagination 设置为false,pageConfig项可以不设置即可
<ELTableclass="table":table-data="tableObject.tableData":columns="tableObject.columns":usePagination="false"
>
</ELTable>const tableObject = reactive<TableType>({columns: [],tableData: []
});

带 tag 的表格

<ELTableclass="table":table-data="tableObject.tableData":columns="tableObject.columns":page-config="tableObject.pageConfig"
>
</ELTable>
  • 需要在 columns 下配置 tagList
import ELTable, { TableType } from '@/components/Table.vue';const tableObject = reactive<TableType>({columns: [{prop: 'date',label: 'Date',attrs: {width: 140}},{prop: 'name',label: 'Name',attrs: {width: 80}},{prop: 'address',label: 'Address',attrs: {width: 180}},{prop: 'alarm',label: '告警等级',attrs: {width: 100},tagList: [{label: '严重',value: '1',className: 'error'},{label: '紧急',value: '2',className: 'warning'},{label: '一般',value: '3',className: 'info'},{label: '提示',value: '4',className: 'success'}]}],pageConfig: {pageSize: 5,total: 100,pagerCount: 5,currentPage: 3,handleCurrentChange: (number: number) => {console.log('重新请求数据', number);}},tableData: [{date: '2016-05-03',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',alarm: '1'},{date: '2016-05-02',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',alarm: '4'},{date: '2016-05-04',name: 'Tom44',address: 'No. 189, Grove St, Los Angeles',alarm: '3'},{date: '2016-05-01',name: 'Tom55',address: 'No. 189, Grove St, Los Angeles',alarm: '1'},{date: '2016-05-01',name: 'Tom55',address: 'No. 189, Grove St, Los Angeles',alarm: '1'}]
});

图片

带按钮的表格

  • 带按钮的表格一般是需要自定义模板的 。需要在 columns 下面的配置项中添加操作选项。然后插槽名则是 prop 的值。
<ELTableclass="table":table-data="tableObject.tableData":columns="tableObject.columns":page-config="tableObject.pageConfig"@current-change="onCurrentTableChange"
><template #operate="{ scope }"><el-button size="small" @click="handleEdit(scope)">Edit</el-button><el-button size="small" type="danger" @click="handleDelete(scope)">Delete</el-button></template>
</ELTable>
import ELTable, { TableType } from '@/components/Table.vue';
const tableObject = reactive<TableType>({columns: [{prop: 'date',label: 'Date',attrs: {width: 140}},{prop: 'name',label: 'Name',attrs: {width: 80}},{prop: 'address',label: 'Address',attrs: {width: 180}},{prop: 'alarm',label: '告警等级',attrs: {width: 100},tagList: [{label: '严重',value: '1',className: 'error'},{label: '紧急',value: '2',className: 'warning'},{label: '一般',value: '3',className: 'info'},{label: '提示',value: '4',className: 'success'}]},{prop: 'operate',label: '操作',slot: true,attrs: {width: '180'}}],pageConfig: {pageSize: 5,total: 100,pagerCount: 5,currentPage: 3,handleCurrentChange: (number: number) => {console.log('重新请求数据', number);}},tableData: [{date: '2016-05-03',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',alarm: '1'},{date: '2016-05-02',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',alarm: '4'},{date: '2016-05-04',name: 'Tom44',address: 'No. 189, Grove St, Los Angeles',alarm: '3'},{date: '2016-05-01',name: 'Tom55',address: 'No. 189, Grove St, Los Angeles',alarm: '1'},{date: '2016-05-01',name: 'Tom55',address: 'No. 189, Grove St, Los Angeles',alarm: '1'}]
});

图片

配置插槽

如果在columns中配置了 sort:true。默认就会读取表格中插槽名称为 props值的结构,放入当前列。

<ELTableclass="table":table-data="tableObject.tableData":columns="tableObject.columns":page-config="tableObject.pageConfig"@current-change="onCurrentTableChange"
><template #aaa="{ scope }"><el-button size="small" @click="handleEdit(scope)">Edit</el-button><el-button size="small" type="danger" @click="handleDelete(scope)">Delete</el-button></template>
</ELTable><script>
import ELTable, { TableType } from '@/components/Table.vue';
const tableObject = reactive<TableType>({columns: [{prop: 'aaa',label: '操作',attrs: {width: '180'},slot: true // 属性为true时 插槽生效,并读取属性名为 aaa 的插槽。},],
});
</script>

配置表格列的原生属性

  • 如果想要配置表格列的原生属性。可以在clounms下的 attrs 中去配置,例如:想要配置 fixedresizableformatter 等…
import ELTable, { TableType } from '@/components/Table.vue';
const tableObject = reactive<TableType>({columns: [{prop: 'date',label: 'Date',attrs: {// 配置表格的原生属性width: 140fixed: true,resizable: trueformatter: function(row,column) {console.log('过滤器')}}},],
});

当前项高亮时触发的方法@selection-change

<ELTableclass="table":table-data="tableObject.tableData":columns="tableObject.columns":page-config="tableObject.pageConfig"@selection-change="onSelectionChange"highlight-current-rowstripe
>
</ELTable>const onSelectionChange = (row) => {console.log('选中当前项时会触发的事件')
}

table表格封装的源码

<template><div class="cus-table"><el-table v-loading="props.loading" :data="props.tableData" style="width: 100%" v-bind="$attrs"><el-table-column v-for="column in props.columns" :key="column.prop" :prop="column.prop" :label="column.label" width="180" v-bind="column?.attrs"><!-- 默认有插槽的情况 --><template #default="scope"><slot v-if="column.slot" :name="column.prop" :scope="scope" /><!-- 当有告警时表格默认做出处理 --><template v-if="column.tagList?.length"><div v-for="(tag, index) in filteredTagList(scope.row, column.tagList, column.prop)" :key="tag.value + '_' + index"><div class="tag" :class="tag.className">{{ tag.label }}</div></div></template></template></el-table-column></el-table><!-- 分页 --><template v-if="props.usePagination"><div class="pagination"><div>总共 {{ pageConfig.total }} 条信息</div><el-paginationv-model:current-page="currentPage"class="cus-pagination"backgroundlayout="prev, pager, next":page-size="pageConfig.pageSize":total="pageConfig.total":pager-count="pageConfig.pagerCount"@current-change="pageConfig.handleCurrentChange"/></div></template></div>
</template><script setup lang="ts">
type TagObjectType = {label: string;value: string;className: 'error' | 'warning' | 'info' | 'success' | 'offline';
};type PageConfigType = {pageSize: number;total: number;pagerCount?: number;currentPage: number;// eslint-disable-next-line no-unused-varshandleCurrentChange?: (val: number) => void;
};type TableColumnType = {prop: string;label: string;attrs?: any;slot?: boolean;tagList?: TagObjectType[];
};export type TableType = {tableData: any[];columns: TableColumnType[];pageConfig?: PageConfigType;loading?: boolean;usePagination?: boolean;
};const props = withDefaults(defineProps<TableType>(), {tableData: () => [],columns: () => [],pageConfig: () => ({pageSize: 5,total: 0,currentPage: 1,}),loading: false,usePagination: true,
});const filteredTagList = (scope: any, tagList: any[], prop: string) => tagList?.filter((tag: any) => tag?.value === scope?.[prop]);const currentPage = ref(props.pageConfig.currentPage);
</script><style lang="scss" scoped>
.error {background-color: rgba(171, 1, 0, 0.2);border: 2px solid rgba(255, 78, 77, 1);
}.warning {background-color: rgba(185, 74, 0, 0.2);border: 2px solid rgba(255, 128, 15, 1);
}.info {background-color: rgba(174, 127, 0, 0.2);border: 2px solid rgba(255, 235, 15, 1);
}.tootip {background-color: rgba(0, 82, 183, 0.2);border: 2px solid rgba(61, 148, 255, 1);
}.success {background-color: rgba(39, 191, 114, 0.2);border: 2px solid rgba(71, 221, 145, 1);
}.offline {background-color: rgba(154, 158, 174, 0.2);border: 2px solid rgba(154, 158, 174, 1);
}.cus-table {width: 100%;position: relative;overflow: hidden;.tag {display: flex;justify-content: center;align-items: center;width: 60px;height: 24px;color: #ffffff;opacity: 0.6;border-radius: 12px;}.pagination {display: flex;justify-content: space-between;align-items: center;margin-top: 30px;font-size: 18px;color: rgba(255, 255, 255, 0.6);}
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高阶算法班从入门到精通之路课程

本课程旨在帮助学员深入理解算法与数据结构的核心概念&#xff0c;从而掌握高级算法设计与分析技能。每集课程内容精心设计&#xff0c;涵盖了常用数据结构、经典算法及其应用场景等方面的深度讲解&#xff0c;同时通过大量实例演练&#xff0c;帮助学员提升解决实际编程难题的…

Vue2基础

目录 一、初识Vue 二、Vue模板语法({{}} / v-bind) 三、数据绑定(v-model) 四、el与data的两种写法 五、MVVM模型 六、数据代理 1、Object.defineProperty 2、Vue中的数据代理 七、事件处理(v-on: / ) 1、事件的基本使用 2、事件修饰符 3、键盘事件 4、总结 八、计…

如何在Qt使用uchardet库

如何在 Qt 中使用 uchardet 库 文章目录 如何在 Qt 中使用 uchardet 库一、简介二、uchardet库的下载三、在Qt中直接调用四、编译成库文件后调用4.1 编译工具下载4.2 uchardet源码编译4.3 测试编译文件4.4 Qt中使用 五、一些小问题5.1 测试文件存在的问题5.2 uchardet库相关 六…

【启明智显分享】乐鑫HMI方案2.8寸触摸串口屏应用于太阳能控制器

前言 太阳能作为一种无尽的、可再生的能源&#xff0c;在现代社会的能源结构中占据着日益重要的地位。而在太阳能应用系统中&#xff0c;有一种设备是不可或缺的&#xff0c;那就是太阳能控制器。太阳能控制器在太阳能系统中起着至关重要的作用&#xff0c;它保证系统的安全和…

uniapp 数据父传子

文章目录 可能出现的问题 在uni-app中&#xff0c;父组件向子组件传递数据主要通过属性绑定的方式实现。这里提供一个简单的示例来说明如何进行父传子的数据传递&#xff1a; 父组件 准备数据: 在父组件的data中定义要传递的数据。 export default {data() {return {parentMe…

Spring解耦合分析和总结

在我们的日常开发中&#xff0c;创建对象的操作随处可见以至于对其十分熟悉的同时又感觉十分繁琐&#xff0c;每次需要对象都需要亲手将其new出来&#xff0c;甚至某些情况下由于坏编程习惯还会造成对象无法被回收&#xff0c;这是相当糟糕的。但更为严重的是&#xff0c;我们一…

Java+前后端分离架构+ MySQL8.0.36产科信息管理系统 产科电子病历系统源码

Java前后端分离架构 MySQL8.0.36产科信息管理系统 产科电子病历系统源码 产科信息管理系统—住院管理 数字化产科住院管理是现代医院管理中的重要组成部分&#xff0c;它利用数字化技术优化住院流程&#xff0c;提升医疗服务质量和效率。以下是对数字化产科住院管理的详细阐述…

Keepalived+HAProxy 集群及虚IP切换实践

1、软件介绍 ①Keepalived keepalive是一个用c语言编写的路由软件&#xff0c;这个项目的主要目标是为Linux系统和基于Linux的基础设施提供简单而健壮的负载平衡和高可用性设施。负载均衡框架依赖于众所周知且广泛使用的Linux Virtual Server (IPVS)内核模块提供第4层负载均衡…

【音视频 | RTSP】RTSP协议详解 及 抓包例子解析

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

maven-surefire-report-plugin插件生成测试报告

目录 官网 pom.xml配置 测试类 执行测试结果 修改测试类 pom文件更改配置maven-jxr-plugin xref xref-test ​Source Xref​ ​Test Source Xref​ 再此验证 有凭&#xff08;有理&#xff09;有据 官网 Maven Surefire Report Plugin – Showing Only Fail…

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题超详细解题思路+数据预处理问题一代码分享

B题 洪水灾害的数据分析与预测 亚太中文赛事本次报名队伍约3000队&#xff0c;竞赛规模体量大致相当于2024年认证杯&#xff0c;1/3个妈杯&#xff0c;1/10个国赛。赛题难度大致相当于0.6个国赛&#xff0c;0.8个妈杯。该比例仅供大家参考。 本次竞赛赛题难度A:B:C3:1:4&…

Java数据结构-树的面试题

目录 一.谈谈树的种类 二.红黑树如何实现 三.二叉树的题目 1.求一个二叉树的高度&#xff0c;有两种方法。 2.寻找二叉搜索树当中第K大的值 3、查找与根节点距离K的节点 4.二叉树两个结点的公共最近公共祖先 本专栏全是博主自己收集的面试题&#xff0c;仅可参考&#xf…

pandas,dataframe使用笔记

目录 新建一个dataframe不带列名带列名 dataframe添加一行内容查看dataframe某列的数据类型新建dataframe时设置了列名&#xff0c;则数据类型为object dataframe的保存保存为csv文件保存为excel文件 dataframe属于pandas 新建一个dataframe 不带列名 df pd.DataFrame() 带…

gda动态调试-cnblog

忽的发现gda有动态调试功能 动态监听返回值 框柱指定方法&#xff0c;选择调试方法&#xff0c;gda会自动监听函数的返回值&#xff0c;例如 自定义frida脚本 gda会自动生成hook该函数的frida脚本

SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]

SpringBoot自定义starter SpringBoot与AOPSpringBoot集成Mybatis-整合druid在不使用启动器的情况下&#xff0c;手动写配置类进行整合使用启动器的情况下,进行整合 SpringBoot启动原理源码解析创建SpringApplication初始化SpringApplication总结 启动 SpringBoot自定义Starter定…

matplotlib下载安装

matplotlib下载安装过程同之前写的pygame很类似。 Pygame下载安装 python官网 1.搜索matplotlib 直接点进去 查看历史版本&#xff0c;因为新版本可能出现与python不匹配问题。 我选择3.6.3版本&#xff0c;因为我安装的python是3.8&#xff0c;可以匹配版本。同时window操…

Android - 模拟器

Android SDK 包括一个在您的计算机上运行的虚拟移动设备模拟器。 该模拟器可让您在不使用物理设备的情况下对 Android 应用程序进行原型设计、开发和测试。 在本章中&#xff0c;我们将探索真实安卓设备中存在的模拟器中的不同功能。 创建 AVD 如果您想模拟真实设备&#xff0c…

赋能心理大模型,景联文科技推出高质量心理大模型数据库

生成式大模型作为当前发展势头最为强劲的人工智能前沿技术&#xff0c;其在临床心理学领域中的创新应用已成为社会关注和医学聚焦的热点之一。 心理大模型在落地应用过程中可能面临的痛点主要包括以下几个方面&#xff1a; 数据隐私与安全&#xff1a;确保敏感的个人信息在模型…

第一次的pentest show总结

第一次的pentest show总结 前言 开始之前&#xff0c;我特别感谢TryHackMe(英)、HackTheBox(美)、zero-point security(英)、offsec(美)等平台&#xff0c;使我们能够通过网络以线上的方式学习与练习&#xff0c;打破传统线下各地区教育资源差异大的限制&#xff0c;对网络教…

磁钢生产领域上下料解决方案

随着智能制造技术的不断革新&#xff0c;磁钢生产领域正逐步引入自动化生产线。然而&#xff0c;传统的人工上下料方式存在诸多问题&#xff0c;难以满足现代生产需求。富唯智能提出了一款复合机器人磁钢上下料解决方案&#xff0c;通过先进的自动化技术&#xff0c;提高生产效…