业务场景

在使用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表格组件技巧:如何简洁实现跨页勾选、跨页统计功能的更多相关文章

  1. 封装一个优雅的element ui表格组件

    现在做后台系统用vue + elementUI 的越来越多,那element ui的 el-table 组件肯定也离不开.虽然element ui的table组件很好.但是表格和分页是分离的.每次写表 ...

  2. [转]vue Element UI走马灯组件重写

    https://blog.csdn.net/u013750989/article/details/82885482 1.element ui走马灯组件 -- carousel分析一波源代码:carou ...

  3. element ui 表格提交时获取所有选中的checkbox的数据

    <el-table ref="multipleTable" :data="appList" @selection-change="changeF ...

  4. vue + element ui 表格自定义表头,提供线上demo

    前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...

  5. Element UI table组件源码分析

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

  6. vue2.0+Element UI 表格前端分页和后端分页

    之前写过一篇博客,当时对element ui框架还不太了解,分页组件用 html + css 自己写的,比较麻烦,而且只提到了后端分页 (见 https://www.cnblogs.com/zdd20 ...

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

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

  8. element ui step组件在另一侧加时间轴显示

    这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...

  9. element UI表格行高、padding等设置报错问题

    element UI里面表格的行高需要自己调整高度和设置padding,直接写style是不行的,里面有 : 1.row-style (行的 style) 2.header-row-styl   (表 ...

随机推荐

  1. jsbrage——和app交互

      <html> <head> <meta content="text/html; charset=utf-8" http-equiv="c ...

  2. 1066 Root of AVL Tree (25分)(AVL树的实现)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  3. 数据挖掘-K-近邻算法

    数据挖掘-K-近邻算法 目录 数据挖掘-K-近邻算法 1. K-近邻算法概述 1.1 K-近邻算法介绍 1.1.1 KNN算法作用 1.1.2 KNN 算法思想 1.1.3 KNN算法特点 1.2 K ...

  4. 部署并测试动态WSGI站点

                                                            部署并测试动态WSGI站点 5.1问题 本例要求为站点webapp0.example.c ...

  5. php zip打包

    zip中加入文件 <?php $zip = new ZipArchive; if ($zip->open('test.zip', ZipArchive::OVERWRITE) === TR ...

  6. Linux Shell编程,双括号运算符(())

    双括号运算符是shell非常强大的扩展. 这里简要介绍两种使用方式: 1.条件判断 跟在if.while.until,for等需要逻辑条件的命令后,进行逻辑判断 if(( expr));then … ...

  7. webpack4.0(01.基础配置和初识)

    1.什么是webpack? 2.webpack可以做什莫? 代码转换.文件优化.代码分割.模块合并.自动刷新.代码校验.自动发布 3.我们要学习webpack的什么? 4.使用webpack 1.首先 ...

  8. Linux服务器架设篇,DNS服务器(二),cache-only DNS服务器的搭建

    一.理论基础 什么是cache-only服务器?即不具备自己正反解Zone的能力,仅进行缓存或转发的DNS服务器.其实它也称不上是DNS服务器.但是也是一个必备的知识点. 这种服务器只有缓存搜索结果的 ...

  9. 【django基础】django接口 异步ajax请求 导出数据库成excel表(包裹前端后端)

    py文件: from django.utils.http import urlquote from rest_framework.views import APIView from django.sh ...

  10. c++用递归法将一个整数n转换成字符串

    任务描述 用递归法将一个整数n转换成字符串.例如,输入483,应输出字符串“483”.n的位数不确定,可以是任意位数的整数. 测试输入: 预期输出: 程序源码: #include <stdio. ...