前言

Element Plus的表格组件提供了筛选功能

前端项目中,如果表格使用的是后端分页,使用表格插件及分页器插件就可以了。这种情况下,前端的表格筛选被后端的分页条件查询取代了

另一种情况:不分页,直接查询所有数据,在前端做查询、筛选、排序

第一种情况下,数据统计由后端直接返回。这里,讨论的是第二种情况

一、需求

想要实现的是在上述第二种情况下,在进行前端筛选、重新获取数据等改变表格内数据总数的操作后,获取该总数。

然而,无法从 ElTable 组件绑定的数据、公开的属性/方法中直接获知

二、解决方案

示例基于 element-plus@2.2.9, vue@3.2.37,使用 vue组合式API实现

文末有 vue3 两种代码风格的完整代码

1. 基本示例

下面是个人员表格,可筛选性别、省份

<script setup>
import { ref, computed, onMounted } from "vue";
import { ElButton, ElTable, ElTableColumn } from "element-plus";const provinces = ["北京", "上海", "广东"];
const tableData = ref([]);
const columns = [{ label: "No", prop: "no", width: 80 },{ label: "Name", prop: "name", width: 100 },{ label: "Age", prop: "age", width: 60 },{label: "Gender",prop: "gender",width: 100,filterable: true,filters: [{ text: "male", value: "male" },{ text: "female", value: "female" },],},{label: "Province",prop: "province",width: 140,filterable: true,filters: [{ text: "北京", value: "北京" },{ text: "上海", value: "上海" },{ text: "广东", value: "广东" },],},{ label: "Tel", prop: "tel", width: 140 },
];const tableEl = ref();onMounted(() => {queryHandler();
});// 获取列表数据
function getTableData(amount = 200) {return new Promise((resolve, reject) => {resolve(Array.from({ length: amount }).map((_, idx) => ({no: "No." + (idx + 1),name: Math.floor(Math.random() * 900000 + 100000).toString(16),age: Math.ceil(Math.random() * 40 + 20),gender: Math.random() > 0.5 ? "male" : "female",province: provinces[Math.floor(Math.random() * 3)],tel: "13311112222",})));});
}
async function queryHandler() {tableEl.value?.clearFilter();const amount = Math.floor(Math.random() * 900) + 100;tableData.value = await getTableData(amount);
}function filterHandler(value, row, column) {const property = column["property"];return row[property] === value;
}
</script><template><el-table ref="tableEl" :data="tableData" max-height="500"><template v-for="col in columns" :key="col.prop"><el-table-columnv-if="col.filterable":prop="col.prop":label="col.label":width="col.width":filters="col.filters":filter-method="filterHandler"></el-table-column><el-table-columnv-else:prop="col.prop":label="col.label":width="col.width"></el-table-column></template></el-table><el-button @click="queryHandler">重新请求列表数据</el-button>
</template>

从表格绑定数据 tableData 中无法获知筛选后的表格数据总量,查阅 Element Plus 官方文档,该组件也没有提供相应接口,那就只能想办法通过某种方案间接实现了

2. 方案

  • 方案一:直接将筛选方法作用于 tableData,手动计算筛选后的表格数据总数

这种方案需要监听表格的 filter-change 事件,然后过滤

由于 filter-change 事件返回的当前更改的筛选条件,存在多个筛选时,需存储过滤条件

总结一下:

> 给表项绑定 column-key 属性;创建存储筛选条件的对象
> 监听表格的 filter-change 事件,更新筛选条件,计算筛选后的表格数据总数
> 表格数据变更时,清空筛选条件

上述第二步,手动计算筛选如果过于复杂,也可以考虑在DOM层面上,在表格渲染完毕后,直接查询条数(<tr>)。

  • 方案二:监听表格组件内部数据

虽然官方未提供直接的属性与方法,但表格组件内部肯定知道满足筛选条件的数据有哪些,问题在于它是否被暴露出来

通过打印表格对象,发现store中找到了相关数据,ElTable 组件内部的状态存储信息:


更完美的是,它是响应式变量,意味着可以直接监听

上例中,我们只需要中添加一个计算变量即可:

import { ref, computed, onMounted } from "vue";const tableEl = ref();
const total = computed(() => tableEl.value?.store?.states?.data?.value?.length ?? 0
);

注意:若使用的是vue选项式API实现,需等待表格组件挂载后,再添加计算变量

三、总结

第一种方案监听筛选事件,再在监听处理事件中手动筛选数据、计算总数,较为繁琐,不太建议使用

方案二依赖于 ElTable 组件内部的状态存储信息,非官网提供的属性/方法,随着版本的更替,指不定什么时候就成潜在的 “Breaking Change” 了。建议核实后锁定项目的 element-plus 的版本

若官方后续提供相应属性/方法,再替换。

四、完整代码

Demo - 基于vue选项式API

Demo - 基于vue组合式API:

<script setup>
import { ref, computed, onMounted } from "vue";
import { ElButton, ElTable, ElTableColumn } from "element-plus";const provinces = ["北京", "上海", "广东"];
const tableData = ref([]);
const columns = [{ label: "No", prop: "no", width: 80 },{ label: "Name", prop: "name", width: 100 },{ label: "Age", prop: "age", width: 60 },{label: "Gender",prop: "gender",width: 100,filterable: true,filters: [{ text: "male", value: "male" },{ text: "female", value: "female" },],},{label: "Province",prop: "province",width: 140,filterable: true,filters: [{ text: "北京", value: "北京" },{ text: "上海", value: "上海" },{ text: "广东", value: "广东" },],},{ label: "Tel", prop: "tel", width: 140 },
];const tableEl = ref();
const total = computed(() => tableEl.value?.store?.states?.data?.value?.length ?? 0
);onMounted(() => {queryHandler();
});// 获取列表数据
function getTableData(amount = 200) {return new Promise((resolve, reject) => {resolve(Array.from({ length: amount }).map((_, idx) => ({no: "No." + (idx + 1),name: Math.floor(Math.random() * 900000 + 100000).toString(16),age: Math.ceil(Math.random() * 40 + 20),gender: Math.random() > 0.5 ? "male" : "female",province: provinces[Math.floor(Math.random() * 3)],tel: "13311112222",})));});
}
async function queryHandler() {tableEl.value?.clearFilter();const amount = Math.floor(Math.random() * 900) + 100;tableData.value = await getTableData(amount);
}function filterHandler(value, row, column) {const property = column["property"];return row[property] === value;
}
</script><template><h3>TableData length: {{ tableData.length }}</h3><h3>Total entries: {{ total }}</h3><el-table ref="tableEl" :data="tableData" max-height="500"><template v-for="col in columns" :key="col.prop"><el-table-columnv-if="col.filterable":prop="col.prop":label="col.label":width="col.width":filters="col.filters":filter-method="filterHandler"></el-table-column><el-table-columnv-else:prop="col.prop":label="col.label":width="col.width"></el-table-column></template></el-table><el-button @click="queryHandler">重新请求列表数据</el-button>
</template>

Element Plus 跟踪表格数据总数,包括查询、筛选等操作相关推荐

  1. element ui Table表格数据筛选功能实现

    先来看看实现效果 element ui Table表格数据筛选功能实现 查看Element官网 关于筛选的实例. 在列中设置filters filter-method属性即可开启该列的筛选,filte ...

  2. vue表单中批量导入功能_vue实战(11)——vue+element UI实现表格数据导出Excel功能

    一.应用场景 按照需求导出功能分为勾选批量导出及按照查询结果导出,考虑到接口操作导出的复杂性,因此实现了js控制导出的功能 导出功能截图 二.安装相关依赖 cnpm install --save xl ...

  3. ant 改变表格数据_学不会这几个操作,面试时千万别说自己精通数据分析

    今年的招聘季好像一直都不太景气,在现有的招聘岗位当中来看,只有一人身兼超多技能,才有可能在茫茫人海中脱颖而出,其中比较有含金量的技能比如说熟练运用Excel.精通数据分析工具,殊不知可不是掌握最基本的 ...

  4. 记element + xlsx 导出表格数据重复的坑

    在使用elementui做管理平台时遇到导出表格的需求,网上有很多解决方案,最多的就是使用xlsx + FileSaver 将页面上的表格转换成excel book. // 安装xlsx filesa ...

  5. Cell插件利用xml上传表格数据于服务器的B/S操作

    引言 随着XML技术发展,XML技术的广泛运用,用友华表cell插件在XML上的运用也取得很大发展,用友华表cell插件可以很方便的将客户端cell报表数据以XML形式发送给服务器,服务器再接受xml ...

  6. Element Plus 虚拟化表格组件的使用(排序、筛选、自定义单元格渲染) - 个人使用总结

    前言 element-plus@2.2.0 后提供虚拟化表格组件,解决表格数据过大导致的卡顿等性能问题.相对于表格组件,用法上区别还是挺大的,尤其是一些附加的功能,例如排序.筛选.自定义单元格/表头渲 ...

  7. 表格号码归属地查询的正确检测方式

    工具/原料: 能上网的电脑一台. 音速表格号码归属地 功能: 1 可以对表格中的归属地,运营商,进行快速的批量查询. 2 可以过滤表格当中重复的号码. 特点: 1. 查询以后的数据直观,明了. 2.  ...

  8. html统计筛选表格count,Excel中工作表数据进行计数和筛选的操作方法

    execl2007作为办公软件,统计数据的功能十分强大,如何对一个工作表的数据进行计数和筛选,今天,学习啦小编就教大家在Excel中工作表数据进行计数和筛选的操作方法. Excel中工作表数据进行计数 ...

  9. easyui数据表格显示复选框_WinCC 报警控件、在线趋势/表格控件数据查询

    1.报警控件数据查询 在WinCC报警记录组态时,我们可以给报警消息定义不同的类别.类型.用户文本块等(图1),有了以上的组态,我们就可以自定义过滤条件,在报警控件中查询或显示分类的报警信息. 图 1 ...

最新文章

  1. 大数据算法:排位问题
  2. Laravel POST请求API接口 使用validate表单验证返回欢迎页
  3. java rsa加密解密_前端实现对请求参数进行RSA加密amp;解密,针对字符串过长进行分段加密amp;分段解密的处理...
  4. Python中面向对象的讲解(3)
  5. qdialog 只有点击才能获得焦点_NCAA上演焦点战,人们关心的却不是胜负
  6. 使用ESCAPE定义转义符
  7. linux c之#include <unistd.h> 总结
  8. LeetCode344. Reverse String
  9. 录屏软件电脑版哪个好?4个电脑免费录屏软件推荐
  10. 设计模式在项目中的应用案例_案例|P6软件在水电项目施工管理中的应用
  11. Android蓝牙手柄摇杆 十字按键监听手机focus焦点
  12. cass块参照怎么改颜色,CASS符号颜色自定义的诀窍,都在这里了!
  13. 友华改设备标识命令_电信路由器密码怎么修改,路由器牌子是友华通信
  14. 【Latex 表格】换行+行高
  15. jQuery动画事件
  16. lc1819——枚举因数并判定,两种解法
  17. SCI/EI/ISTP论文收录索引号的查询方法
  18. CSDN直播预告丨“0成本”、可二次开发的开源OA开发平台,你是时候来了解下了!
  19. 春招面试经验系列(一)菜鸟网络
  20. BCDEDIT用法实例讲解

热门文章

  1. 数商云食品行业数字化供应链转型解决方案
  2. LED通信的ID识别报告
  3. linux-使用screen后台运行命令,防止断网导致异常退出,命令没运行完成
  4. 计算机组成原理 定点加法、减法 练习题
  5. 用谷歌还是火狐?手机端还是另外选择其他浏览器吧
  6. 什么是个人热点?安卓手机怎么开启个人热点?
  7. 10分钟教你搭建nexus,并把自己项目中的依赖上传到私服
  8. HTML5七夕情人节表白网页❤抖音超火的樱花雨3D相册❤ HTML+CSS+JavaScript
  9. 使用 ClickHouse 构建通用日志系统
  10. 勾股定理竟然有500种证明方法,你会几种?