Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能
业务场景
在使用Element UI的Table组件时,常常面对这样的业务需求:
表格数据的每一项都要提供勾选框,当切换分页时,能够记忆所有页面勾选的数据,以实现批量提交不同页面勾选数据的功能。并且,表格下方实时统计已勾选数据的项数、重量、金额等。
“弯路”分析
我们可能会走“弯路”,使用过于复杂的逻辑去实现。常见的弯路是:
在Vue的data里面存储已勾选数据的数组,而后基于table的selection-change或select、select-all事件去动态修改已勾选数组的数据。切换分页时,遍历当前页面数据判断每一条是否在已勾选数组中,若在,则使用toggleRowSelection手动去设置每条数据的勾选状态。
使用以上方式或者类似方式肯定能够实现目标,但需要考虑的问题过多,过于繁琐,例如:
- 使用一维数组还是二维数组存储数据?各有何优劣?
- 存储每条数据的id还是整条数据?各有何优劣?
- select、select-all、selection-change这几个事件之间如何抉择?
- toggleRowSelection方法的调用时机?若是只存储了id,又该如何调用该方法?
事实上,这将使得记忆勾选和统计功能显得过于复杂,很容易出现bug,想要完全厘清并不容易。
推荐解决方案:row-key、reserve-selection、@selection-change
Element UI官网并没有提供直接的demo用于展示如何实现上述业务场景,但文档中却隐晦的表露出通过设置一些属性和方法是可以较为简洁的实现目标的。
基于table的两个属性row-key、reserve-selection和一个事件selection-change即可以非常简洁的实现。
(一)给el-table绑定row-key属性
row-key属性实际的作用是标识表格每行数据是通过哪个属性来进行区别的,一般而言id比较常见。
<el-table :data="tableData" border row-key="id"></el-table>
绑定了row-key属性后,即便跨页,由于不同页数据的id不同,因此组件依然可以进行区分从而实现记忆。
(二)给type=selection的el-table-column设置reserve-selection属性
reserve-selection的作用是在数据更新之后保留之前选中的数据。它和勾选是密切相关的,因此必须设置在type=selection的那一列上,只需简单绑定true即可。
<el-table-column type="selection" width="55" :reserve-selection='true'>
</el-table-column>
现在已经能够实现记忆勾选,但无法进行勾选统计,因此还需要进行第三步。
(三)给el-table绑定selection-change事件
这一步的目的在于存储所有已勾选的数据,以实现对已勾选数据的计算。有了前两步的设置,selection-change返回的参数selection将是所有页面已勾选的数据,这使我们的问题变得异常简单。
<el-table :data="tableData" border row-key="id"
@selection-change="handleSelectionChange"></el-table>
export default {
data(){
return {
tableData:[],
selectedData:[]
};
},
methods:{
handleSelectionChange(rows){
this.selectedData = rows;
}
}
(四)使用计算属性实现统计
由第三步可知,selectedData保存了所有页面的已勾选数据,因此我们只需要使用计算属性对selectedData进行计算即可实现统计。
export default {
data(){
return {...};
},
methods:{...},
computed:{
checkedWeight(){
let totalWeight = 0;
this.selectedData.forEach(item =>{
totalWeight += item.weight;
});
return totalWeight.toFixed(2);
}
}
}
而后在视图中绑定计算属性即可完成。
Element UI表格组件技巧:如何简洁实现跨页勾选、跨页统计功能的更多相关文章
- 封装一个优雅的element ui表格组件
现在做后台系统用vue + elementUI 的越来越多,那element ui的 el-table 组件肯定也离不开.虽然element ui的table组件很好.但是表格和分页是分离的.每次写表 ...
- [转]vue Element UI走马灯组件重写
https://blog.csdn.net/u013750989/article/details/82885482 1.element ui走马灯组件 -- carousel分析一波源代码:carou ...
- element ui 表格提交时获取所有选中的checkbox的数据
<el-table ref="multipleTable" :data="appList" @selection-change="changeF ...
- vue + element ui 表格自定义表头,提供线上demo
前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...
- Element UI table组件源码分析
本文章从如下图所示的最基本的table入手,分析table组件源代码.本人已经对table组件原来的源码进行削减,源码点击这里下载.本文只对重要的代码片段进行讲解,推荐下载代码把项目运行起来,跟着文章 ...
- vue2.0+Element UI 表格前端分页和后端分页
之前写过一篇博客,当时对element ui框架还不太了解,分页组件用 html + css 自己写的,比较麻烦,而且只提到了后端分页 (见 https://www.cnblogs.com/zdd20 ...
- 普通element ui table组件的使用
1.使用基础的element ui 的table的基础使用 首先,使用前要先引用element库到项目中,可以直接引入element的js和css或者在vue项目下按需加载不同的组件 废话不多说,直接 ...
- element ui step组件在另一侧加时间轴显示
这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...
- element UI表格行高、padding等设置报错问题
element UI里面表格的行高需要自己调整高度和设置padding,直接写style是不行的,里面有 : 1.row-style (行的 style) 2.header-row-styl (表 ...
随机推荐
- 1031 Hello World for U (20分)
Given any string of N (≥) characters, you are asked to form the characters into the shape of U. For ...
- 1025 PAT Ranking (25 分)
Programming Ability Test (PAT) is organized by the College of Computer Science and Technology of Zhe ...
- 剑指offer—单链表反转的三种实现方法
单链表的反转可以用递归.非递归和栈的方法实现 链表节点定义: struct ListNode{ int val; Node* next; ListNode(int x):val(x),next(nul ...
- 虚拟机的vmnet8网卡找不到了
不知道我设置了什么,在我于Linux中配置网络时发现怎么都不行,检查了一下发现用于NAT的网卡没有了. 我重启了电脑之后发现还是没有. 于是按照网上的办法在虚拟网络编辑器将其重置,如下图. 问题解决. ...
- Spring XML Bean 定义的加载和注册
前言 本篇文章主要介绍 Spring IoC 容器怎么加载 bean 的定义元信息. 下图是一个大致的流程图: 第一次画图,画的有点烂.
- 用ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统
用http://ASP.NET MVC5 +SQLSERVER2014搭建多层架构的数据库管理系统 背景:前段时间,给一家公司做外包(就是图标是朵菊花那家).为了尽快实现交付,网上四处寻找适合中小型企 ...
- AJ整理问题之:NSTimer准确吗?
NSTimer准确吗? 问题:NSTimer准确吗?如果不准确,怎么办? NSTimer的工作原理:假设timer每隔一段时间执行一次事件,很均匀的(例如每隔多少秒),假设在某一时刻cpu在做疯狂的大 ...
- 原创Pig0.16.0安装搭建
tar -zxvf pig-0.16.0.tar.gz -C ~ vi ~/.bash_profile export PIG_HOME=/home/hadoop/pig-0.16.0 export ...
- python做个谷歌内核浏览器
源码: import sys,os os.chdir(os.path.dirname(os.path.abspath(__file__))) from PyQt5.QtGui import * fro ...
- Python - 利用词云wordcloud,jieba和中国地图制作四大名著的热词图
热词图很酷炫,也非常适合热点事件,抓住重点,以图文结合的方式表现出来,很有冲击力.下面这段代码是制作热词图的,用到了以下技术: jieba,把文本分词 wordcloud,制作热图 chardet,辨 ...