本文主要实现:根据el-table表格数据自动生成表头筛选条件的方法,可根据表格数据动态调整。

el-table表格的表头增加筛选功能,大家平时都是怎么实现的呢?先看看官方文档的例子:

 1 <template>
2 <el-button @click="resetDateFilter">清除日期过滤器</el-button>
3 <el-button @click="clearFilter">清除所有过滤器</el-button>
4 <el-table
5 ref="filterTable"
6 :data="tableData"
7 style="width: 100%">
8 <el-table-column
9 prop="date"
10 label="日期"
11 sortable
12 width="180"
13 column-key="date"
14 :filters="[{text: '2016-05-01', value: '2016-05-01'}, {text: '2016-05-02', value: '2016-05-02'}, {text: '2016-05-03', value: '2016-05-03'}, {text: '2016-05-04', value: '2016-05-04'}]"
15 :filter-method="filterHandler"
16 >
17 </el-table-column>
18 <el-table-column
19 prop="name"
20 label="姓名"
21 width="180">
22 </el-table-column>
23 <el-table-column
24 prop="address"
25 label="地址"
26 :formatter="formatter">
27 </el-table-column>
28 <el-table-column
29 prop="tag"
30 label="标签"
31 width="100"
32 :filters="[{ text: '家', value: '家' }, { text: '公司', value: '公司' }]"
33 :filter-method="filterTag"
34 filter-placement="bottom-end">
35 <template slot-scope="scope">
36 <el-tag
37 :type="scope.row.tag === '家' ? 'primary' : 'success'"
38 disable-transitions>{{scope.row.tag}}</el-tag>
39 </template>
40 </el-table-column>
41 </el-table>
42 </template>
43
44 <script>
45 export default {
46 data() {
47 return {
48 tableData: [{
49 date: '2016-05-02',
50 name: '王小虎',
51 address: '上海市普陀区金沙江路 1518 弄',
52 tag: '家'
53 }, {
54 date: '2016-05-04',
55 name: '王小虎',
56 address: '上海市普陀区金沙江路 1517 弄',
57 tag: '公司'
58 }, {
59 date: '2016-05-01',
60 name: '王小虎',
61 address: '上海市普陀区金沙江路 1519 弄',
62 tag: '家'
63 }, {
64 date: '2016-05-03',
65 name: '王小虎',
66 address: '上海市普陀区金沙江路 1516 弄',
67 tag: '公司'
68 }]
69 }
70 },
71 methods: {
72 resetDateFilter() {
73 this.$refs.filterTable.clearFilter('date');
74 },
75 clearFilter() {
76 this.$refs.filterTable.clearFilter();
77 },
78 formatter(row, column) {
79 return row.address;
80 },
81 filterTag(value, row) {
82 return row.tag === value;
83 },
84 filterHandler(value, row, column) {
85 const property = column['property'];
86 return row[property] === value;
87 }
88 }
89 }
90 </script>

其中的筛选条件:

:filters="[{text: '2016-05-01', value: '2016-05-01'}, {text: '2016-05-02', value: '2016-05-02'}, {text: '2016-05-03', value: '2016-05-03'}, {text: '2016-05-04', value: '2016-05-04'}]"
:filters="[{ text: '家', value: '家' }, { text: '公司', value: '公司' }]"

文档中的数据较少,这些筛选条件写起来并没有很复杂,但如果在数据量大的表格数据中,一个个手写的话,工作量将会很大,且也没有意义。下面我们将封装一个可根据数据自动生成筛选条件的方法!

首先我们得拿到表格当前页的数据,通过对数据的处理,来返回表头筛选数据。

 1 tableFilter(list){ // 传入表格数据
2 let filters = {}
3 if (list.length) {
4 Object.keys(list[0]).forEach(item => { // 拿到第一条数据,将key值组成数组,并将key给filters对象作为键名,值为空数组
5 filters[item] = []  
6 })
7 list.forEach(item => { // 遍历表格的数据数组
8 for (let key in item) { // 遍历数据数组的每一项(对象)
9 if (filters.hasOwnProperty(key) && !filters[key].find(i => i.text == item[key])) { // 如果filters对象中有当前键名(它的值是数组),并且该数组中不含当前值的对象
10 filters[key].push({text: item[key], value: item[key]}) // filters当前键名对应的值(数组),再push该值组成的对象(el-table筛选条件的格式)
11 }
12 }
13 })
14 }
15 return filters;
16 }

上面这段代码的主要干了这么一件事:拿到表格的所有数据,将数据中所有对象的键和值单独取出,做个归类,即filters对象中的键跟表格的每条数据的键是一致的,只不过filters的属性值是表格所有对象对应的属性值形成的数组!

js方法已经封装好,下面来看html代码怎么写:

 1 <el-table :data="pageGoods" border current-row-key empty-text="暂无数据" fit highlight-current-row size="mini" style="width: 100%;">
2
3 <el-table-column align="left" label="商品类别" width column-key="goodClass" prop="goodClass" sortable :filters="headFilters['goodClass']"
4 :filter-method="filterHandler">
5 <template slot-scope="scope">
6 <span>{{ scope.row.goodClass }}</span>
7 </template>
8 </el-table-column>
9 <el-table-column align="left" prop="similarGroup" label="商品类似群组" width column-key="similarGroup" sortable :filters="headFilters['similarGroup']"
10 :filter-method="filterHandler">
11 <template slot-scope="scope">
12 <span>{{ scope.row.similarGroup }}</span>
13 </template>
14 </el-table-column>
15 <el-table-column align="left" label="商品代码" width column-key="goodCode" prop="goodCode" sortable :filters="headFilters['goodCode']"
16 :filter-method="filterHandler">
17 <template slot-scope="scope">
18 <span>{{ scope.row.goodCode }}</span>
19 </template>
20 </el-table-column>
21 <el-table-column align="left" label="商品中文名称" width column-key="goodName" prop="goodName" sortable :filters="headFilters['goodName']"
22 :filter-method="filterHandler">
23 <template slot-scope="scope">
24 <span>{{ scope.row.goodName }}</span>
25 </template>
26 </el-table-column>
27 <el-table-column align="left" label="商品英文名称" width column-key="goodEnName" prop="goodEnName" sortable :filters="headFilters['goodEnName']"
28 :filter-method="filterHandler">
29 <template slot-scope="scope">
30 <span>{{ scope.row.goodEnName }}</span>
31 </template>
32 </el-table-column>
33
34 <el-table-column align="left" label="操作" width>
35 <template slot-scope="scope">
36 <el-button @click="delgood(scope.row)" type="text">删除</el-button>
37 </template>
38 </el-table-column>
39
40 </el-table>

以上代码中的 headFilters就是上面封装的方法tableFilter的返回值,哪一列需要过滤条件就直接在这个headFilters对象中取值==> :filters="headFilters['currentProp']"。

页面效果:

好像一切正常,实现了过滤的效果,可是当增加表格数据后,会出现一些问题:

发现问题了没,没错,表头筛选条件并没有增加,也就是说没有动态改变表头的条件!经过打印验证,表头的对象对应的属性值数组是有值的,那只有一种可能,表格的表头数据没有同步渲染出来!为了解决这个问题,我们可以给整个表格加一个key,这样表格数据变化的时候,可以及时的渲染出最新的表格。

<el-table :key="changeKey" :data="pageGoods" border current-row-key empty-text="暂无数据" fit highlight-current-row size="mini">
 1 getgoodsList (goods) {
2 this.goodslistPageData.total = goods.length;
3
4 var offset =
5 (this.goodslistPageData.pageNo - 1) * this.goodslistPageData.pageSize;
6 this.pageGoods =
7 offset + this.goodslistPageData.pageSize >= goods.length
8 ? goods.slice(offset, goods.length)
9 : goods.slice(offset, offset + this.goodslistPageData.pageSize);
10 this.headFilters = this.tableFilter(this.pageGoods)
11 this.changeKey = !this.changeKey
12 console.log(this.pageGoods);
13 },

当表格数据发生变化的时候,将表格的key值取反,这样就能保证每次数据变化,表格的key也会随之变化啦~ 再看效果:

以上数据都是一条条加进去的,筛选条件也会随之变化啦!至此,table表头过滤条件的方法封装已经全部实现,更多业务相关的方法封装,传送门https://github.com/wangruibin666/wang-utils

脚踏实地行,海阔天空飞~

element ui table表头动态筛选条件的更多相关文章

  1. Vue+element ui table 导出到excel

    需求: Vue+element UI table下的根据搜索条件导出当前所有数据 参考: https://blog.csdn.net/u010427666/article/details/792081 ...

  2. VUE -- 对 Element UI table中数据进行二次处理

    时间——日期 后台经常给我们返回的是 时间戳 (例如:1535620671) 这时候我们页面展现的时候需要将时间戳转换为我们要的格式 例如 (YYYY-MM-DD HH:mm:ss) 如果是在Elem ...

  3. Element UI table组件源码分析

    本文章从如下图所示的最基本的table入手,分析table组件源代码.本人已经对table组件原来的源码进行削减,源码点击这里下载.本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章 ...

  4. Element UI table参数中的selectable的使用

    Element UI table参数中的selectable的使用中遇到的坑:页面: <el-table-column :selectable='selectable' type="s ...

  5. element UI table 过滤 筛选问题

    一.问提描述    使用elementUI table 官方筛选案例,发现筛选不是服务器端筛选,而是浏览器端对每一页进行单独筛选. 如何在服务器端筛选? 二.查询Element UI 官网table组 ...

  6. element ui table render-header自定义表头信息使用

    在使用vue自定义组件内容过程之中,我们绝大多数情况下都是通过预先写好不同的html模板,再通过props传入不同的值来渲染不同的模板.例如我们需要实现一个<v-title size='1'&g ...

  7. 普通element ui table组件的使用

    1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...

  8. element ui table 导出excel表格

    https://blog.csdn.net/u010427666/article/details/79208145 vue2.0 + element UI 中 el-table 数据导出Excel1. ...

  9. vue + element ui 实现实现动态渲染表格

    前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...

随机推荐

  1. AI框架精要:设计思想

    AI框架精要:设计思想 本文主要介绍飞桨paddle平台的底层设计思想,可以帮助用户理解飞桨paddle框架的运作过程,以便于在实际业务需求中,更好的完成模型代码编写与调试及飞桨paddle框架的二次 ...

  2. 如何为嵌入式应用选择适当的SSD

    如何为嵌入式应用选择适当的SSD Selecting the right SSD for evolving embedded applications 变革涉及技术的每一个要素,闪存也不例外.价格下跌 ...

  3. 为IHttpClientFactory添加动态命名配置

    某些时候我们需要为HttpClient动态配置一些东西, 例如证书等, 参考博问 如何使用IHttpClientFactory动态添加cer证书. 例如服务是一个回调服务, 而被回调方采用了自定义的h ...

  4. POI导出Excel时下拉列表值超过255的问题(String literals in formulas can't be bigger than 255 characters ASCII)

    //创建Excel工作薄对象 Workbook workbook = new HSSFWorkbook(); //生成一个表格 设置:页签 Sheet sheet = workbook.createS ...

  5. [源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & Driver

    [源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & Driver 目录 [源码解析] 深度学习分布式训练框架 horovod (4) --- 网络基础 & ...

  6. 【NX二次开发】Block UI 指定坐标系

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  7. 【NX二次开发】移动WCS坐标系

    说明:移动WCS坐标系 用法: #include <uf.h> #include <uf_csys.h> extern DllExport void ufusr(char *p ...

  8. Unicode编码转换, MD5加密,URL16进制加密解密

    一.站长网址:http://www.msxindl.com/ 1.Unicode与中文互转 16进制Unicode编码转换.还原   :http://www.msxindl.com/tools/uni ...

  9. DBA入门相关知识介绍

    DBA(database administrator):数据库管理员                           DBMS(database management system):数据库管理系 ...

  10. No serializer found for class com.bean.user and no properties discovered to create BeanSerializer

    解决方法: 方法1:将bean目录下的实体类属性由private改为public(不推荐): 方法2:给实体类属性设置setter和getter方法(推荐使用).