工作一年,主要职责是负责公司后台管理平台的开发与维护。此间面对各种业务需求,通过面向谷歌编程等常见方式,积累了一些微不足道的经验。
本篇为总结的第一篇(也许有其他篇)—— table 篇
对于后台管理平台来说,最必不可少的元素就是 table 表格,几乎每个页面都涉及到表格的使用,甚至常作为是页面的主体部分。
因此,如何维护这些 table,并且根据业务需求完善不同解决方案,便是此文所会表达的内容。
主要技术栈如题为 vue 全家桶配合 element-ui(其他技术栈其实思路是类似的),因此主要还是对 el-table 等的再封装等。element-ui 的文档已经非常通俗易懂,本文不涉及一些文档上已有的基本用法。
接下来我会模拟一些简单的数据来展示一些业务问题的解决方案,其目的在展示思路,代码以简易为主。
1. 自定义列表项
很多时候我们需要将后端数据作展示优化
1 | // mock 数据(跳过直接往下看) |
本次 table 数据以上面数据模拟后端传值。我们除了要展示这些字段,还要将后面 5 个 数据作相除或求百分比等,常规写法如下(不用细看):
1 | <el-table |
可以看到,仅仅是这十来个字段,就让页面显得非常臃肿,而且很多重复,可想而知如果字段增致几十上百,展示方式更加繁琐,开发维护不易。
用表驱动编程进行优化
表驱动法是《代码大全》里面提到编程方法,适用于多个 if-else 这样形式的代码,这里自然十分适用。
demo 代码的目录结构
tableData.js
将要展示的字段按顺序,以一定参数形式的数组结构放在 TABLE_DATA_MAP
对象内,如目前仅有的 tableDemo 即表示为我们上面代码的表结构数组。
1 | /** |
tableColumn.vue
用于对 el-table-colum 的二次封装,配合上面表结构使用(直接看代码,其中 toFixedTwo,toPercent 函数在 mixin 混入)
1 | <template> |
Table.vue
优化后的页面如下,与之前相比是不是简洁了不少
1 | <template> |
除了一些必要参数(如 key label)外,你可以在 tableData.js 中自定义任何参数,配合 tableColumn.vue 使用。与此同时,你可以在 tableColumn.vue 上对一些单独字段进行特殊处理
1 | // 对 xxx 字段进行自定义 |
合计列
此时如果需求要求合计值,也能够通过 TABLE_DATA_MAP
内数据快速实现(表驱动法经典场景,你可以想象不用现在的方法需要几个 if-else)
1 | <template> |
动态列表配置
对于一些列表字段较多的 table 页面,实现列表字段的动态配置的需求就自然而然产生了。
也是得益于我们的表驱动法,我们能够很简单得做到这一点。
更新的目录结构:
Table.vue
1 | <template> |
transfer.vue
1 | <template> |
tableColumn.vue
1 | <template> |
store/index.js
这里使用 vuex 存储 currentTableData(现在所配置的列表字段),如果是实际工作中,该数据应该存储于后端数据(后端保存当前用户对该页面的设置,而后在 tableColumn.vue 页获取)
1 | import Vue from 'vue' |
思路十分简单,本质就是在后端保存一份当前页面用户表格的私人定制 TABLE_DATA_MAP
文件。
2. 前端导出 table
导出 table 表格是很常见的需求,基本上一些统计页面必备。
导出有多种方式:
1. 后端实现数据
主要是后端将生成的 table 数据流给到前端,然后前端生成下载链接,模拟点击效果。
1 | downloadFile(data) { |
此种方法适用于有分页且分页量十分大,还有页面数据的展示和导出与后端传递数据(与上面我们需要对数据进行百分比等变化的数据不同)的情况。
2. 前端导出
需要引入 xlsx 和 file-saver
1 | yarn add slsx file-saver -S |
前端实现导出常见的又有两种方法:
2.1. 通过页面 Dom 元素获取数据导出
1 | /* eslint-disable */ |
此种方法适用于无分页、导出数据即为页面看到的样子的情况。
2.2 通过 Export2Excel.js
1 | /* eslint-disable */ |
Export2Excel.js 网上有很多版本,大同小异。我对其 export_json_to_excel
函数作了封装,Export2Excel.js 里面也有通过 DOM 导出的方法,但使用时会崩溃,因此通过 DOM 导出推荐 2.1 方法