基于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-columnv-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-columnv-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.hqwc.cn/news/308527.html

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

相关文章

web前端开发html/css求职简介/个人简介小白网页设计

效果图展示&#xff1a; html界面展示&#xff1a; html/css代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.…

基于Python、Keras和OpenCV的实时人脸活体检测

你在互联网上找到的大多数人脸识别算法和研究论文都遭受照片攻击。这些方法在检测和识别来自网络摄像头的图像、视频和视频流中的人脸方面非常有效。然而&#xff0c;他们无法区分现实生活中的面孔和照片上的面孔。这种无法识别人脸的现象是由于这些算法在二维帧上工作。 现在…

VS2013中特殊操作

代码段管理器(查看代码补全快捷方式) 1.点击 工具 ->点击 代码片段管理器->看到 语言->选择 Visual C 2.可以点击下方添加 自定义一个属于自己的快捷代码补全方式 3.结果图&#xff1a; 设置自动换行与行号 1.点击 工具->点击 选项->找到 文本编辑器(然后点击)…

cleanmymac这个软件怎么样?值不值得下载

cleanmymac是我必装的mac端清理软件&#xff0c;界面简洁好看&#xff0c;完美适配mac系统&#xff0c;文件清理的速度、精度都比较优秀&#xff0c;还是比较不错的呢。cleanmymac作为一款第三方清洁应用程序&#xff0c;具有专业完整的清理功能&#xff0c;包括释放内存、一键…

Live800:客户体验策略是什么?企业如何制定客户体验策略?

客户体验策略是企业为了提升顾客对产品或服务的感知和满意度而采取的一系列措施和方法。它关注的是如何创造一个积极、愉悦和有价值的购买过程&#xff0c;从而建立长期的客户关系和忠诚度。客户体验策略是企业成功的关键之一&#xff0c;因为它能够帮助企业在竞争激烈的市场中…

如何像高级软件工程师一样使用vscode做开发

以一个真实的代码库为例&#xff0c;带您了解高级软件工程的关键原则是什么&#xff0c;以及如何充分利用vscode提供的各种特性来提高开发效率。您可以将学到的技巧和思想应用于任何项目。 视频地址&#xff1a; 如何像高级软件工程师一样使用vscode做开发 欢迎关注公众号&a…

JDK9及之后版本使用 jlink 生成定制化的 JRE

许多java软件的运行需要依赖jre&#xff0c;在 jdk8 之后&#xff0c;不再提供默认的 jre&#xff0c;后续如果项目中还是想用 jre 的形式发布软件&#xff0c;那么可以使用 jlink 工具生成 jre。 一、jlink 命令详解 jlink 二、查看jdk中包含的所有模块 如果在 jdk 安装文件夹…

从0到1浅析Redis服务器反弹Shell那些事

文章目录 前言Redis服务1.1 特点与应用1.2 安装与使用1.3 语法和配置1.4 未授权访问 反弹Shell2.1 Web服务写入Webshell2.2 Linux定时任务反弹shell2.3 /etc/profile.d->反弹shell2.4 写入ssh公钥登录服务器2.5 利用Redis主从复制RCE2.6 SSRF漏洞组合拳->RCE 总结 前言 …

HTML实战演练之贪吃蛇美食大作战

导入&#xff1a; 一 &#xff1a;粉丝要求 今天一位小伙伴私信我说&#xff0c;想玩HTML贪吃蛇美食大作战&#xff0c;自己也是学HTML的&#xff0c;希望我能安排一下&#xff0c;那么好它来了 需知&#xff1a; 一&#xff1a;别着急先看需要知道的 要用HTML开发贪吃蛇美食…

SparkStreaming_window_sparksql_reids

1.5 window 滚动窗口滑动窗口 window操作就是窗口函数。Spark Streaming提供了滑动窗口操作的支持&#xff0c;从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据&#xff0c;会被聚合起来执行计算操作&#xff0c;然后生成的RDD&#xff0c;会…

OfficeWeb365 Indexs 任意文件读取漏洞复现

0x01 产品简介 OfficeWeb365 是专注于 Office 文档在线预览及PDF文档在线预览云服务,包括 Microsoft Word 文档在线预览、Excel 表格在线预览、Powerpoint 演示文档在线预览,WPS 文字处理、WPS 表格、WPS 演示及 Adobe PDF 文档在线预览。 0x02 漏洞概述 OfficeWeb365 /Pi…

【软件工程】走进瀑布模型:传统软件开发的经典之路

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 主要阶段&#xff1a; 优点&#xff1a; 缺点&#xff1a; 应用范围&#xff1a; 结语 我的其他博客 前言&am…