element ui table表头动态筛选条件
本文主要实现:根据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表头动态筛选条件的更多相关文章
- Vue+element ui table 导出到excel
需求: Vue+element UI table下的根据搜索条件导出当前所有数据 参考: https://blog.csdn.net/u010427666/article/details/792081 ...
- VUE -- 对 Element UI table中数据进行二次处理
时间——日期 后台经常给我们返回的是 时间戳 (例如:1535620671) 这时候我们页面展现的时候需要将时间戳转换为我们要的格式 例如 (YYYY-MM-DD HH:mm:ss) 如果是在Elem ...
- Element UI table组件源码分析
本文章从如下图所示的最基本的table入手,分析table组件源代码.本人已经对table组件原来的源码进行削减,源码点击这里下载.本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章 ...
- Element UI table参数中的selectable的使用
Element UI table参数中的selectable的使用中遇到的坑:页面: <el-table-column :selectable='selectable' type="s ...
- element UI table 过滤 筛选问题
一.问提描述 使用elementUI table 官方筛选案例,发现筛选不是服务器端筛选,而是浏览器端对每一页进行单独筛选. 如何在服务器端筛选? 二.查询Element UI 官网table组 ...
- element ui table render-header自定义表头信息使用
在使用vue自定义组件内容过程之中,我们绝大多数情况下都是通过预先写好不同的html模板,再通过props传入不同的值来渲染不同的模板.例如我们需要实现一个<v-title size='1'&g ...
- 普通element ui table组件的使用
1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...
- element ui table 导出excel表格
https://blog.csdn.net/u010427666/article/details/79208145 vue2.0 + element UI 中 el-table 数据导出Excel1. ...
- vue + element ui 实现实现动态渲染表格
前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...
随机推荐
- ITS智能交通监控系统技术解析
ITS智能交通监控系统技术解析 红灯,逆行,变 车辆抓拍和车速检测 非法停车和交通流量检测 交叉路口违法检测 发生碰撞的交叉口是智能交通管理. 机动执法 当你需要一个可以移动的系统时,会跟着你移动.移 ...
- H265与ffmpeg改进开发
H265与ffmpeg改进开发 1. Introduction KSC265是集编码.解码于一体的H.265编解码软件,完全遵循H.265协议标准.符合H.265编码规范的视频都可以通过KSC265进 ...
- MySQL必知必会笔记——查询的基础知识
查询基础知识 第七章 数据过滤 组合where子句 MySQL允许给出多个WHERE子句.这些子 句可以两种方式使用:以AND子句的方式或OR子句的方式使用. AND操作符 可使用AND操作符给WHE ...
- 【九】Kubernetes 之 Service 概念图文讲解及功能演示
Service 概念 Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 -- 通常称为微服务. Service 通常是通过 Label Selec ...
- 【Java编程实战】Metasploit_Java后门运行原理分析以及实现源码级免杀与JRE精简化
QQ:3496925334 文章作者:MG1937 CNBLOG博客ID:ALDYS4 未经许可,禁止转载 某日午睡,迷迷糊糊梦到Metasploit里有个Java平台的远控载荷,梦醒后,打开虚拟机, ...
- 【linux】驱动-12-并发与竞态
目录 前言 12. 并发&竞态 12.1 并发&竞态概念 12.2 竞态解决方法 12.3 原子 12.3.1 原子介绍 12.3.2 原子操作步骤 12.3.3 原子 API 12. ...
- 【题解】[LuoguP3503]「BZOJ2086」[POI2010] Blocks
题目描述 给出N个正整数a[1..N],再给出一个正整数k,现在可以进行如下操作:每次选择一个大于k的正整数a[i],将a[i]减去1,选择a[i-1]或a[i+1]中的一个加上1.经过一定次数的操作 ...
- linux常用命令及一些静态动态库相关知识
1 查找然后grep,最后在复制到特定目录 find . -depth -name *.java | xargs grep -i lijiangtao | awk -F ":" ' ...
- Linux 安装及管理程序
Linux 安装及管理程序 目录 一.Linux应用程序基础 1.1.应用程序与系统命令的关系 1.2.典型应用程序的目录结构 1.2.常见的软件包封装类型 二.RPM包管理工具 2.1.RPM软件包 ...
- 整合Spring Cloud Stream Binder与GCP Pubsub进行消息发送与接收
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 之前的文章<整合Spring Cloud Stream Binder与RabbitMQ进行消息发送与接收& ...