vue.js实现表格合并示例代码


Posted in Javascript onNovember 30, 2016

前言

由于使用的是vue,想到MVVM是要用数据驱动的思想,所以考虑在Model做手脚,而不是渲染出数据来后做DOM操作,当然基本的CSS还是要有的。因此这个方法对所有数据驱动的框架都有效,比如说Angular和React。

最后的实现效果是这样的:

vue.js实现表格合并示例代码

实现思路

原本的正常表格的代码长这样:

<tr v-for="item in items">
 <td width="3%">{{ $index + 1 }}</td>
 <td width="15%">{{item.bsO_Name}}</td>
 <td width="8%" :class="{'overtime': overtime(item.GathDt)}">{{item.GathDt | time}}</td>
 <td width="5%">{{item.F1}}</td>
 <td width="5%">{{item.F2}}</td>
 <td width="5%">{{item.F4}}</td>
 <td width="5%">{{item.F3}}</td>
 <td width="5%">{{item.F5}}</td>
 <td width="5%">{{item.F6}}</td>
 <td width="5%">{{item.F7}}</td>
 <td width="5%">{{item.F8}}</td>
 <td width="5%">{{item.F9}}</td>
 <td width="5%">{{item.F10}}</td>
</tr>

先拿正常的表格来做测试,原生的<td>标签就有rowspan属性支持单元格行合并,属性值指的是向下合并多少行,其实就相当于在本行中向下又添加了几个单元格。

因为,如果接下来的一行还会渲染的话就会被挤下去,因此,下面被合并的单元格要隐藏掉,通过display: none; css控制即可。

因此,每个<td>标签需要带有两个属性值,rowspandisplay来控制每一个单元格的合并行数和是否显示。

代码变成这样了

<tr v-for="item in items">
 <td width="3%">{{ $index + 1 }}</td>
 <td width="10%" :rowspan="item.bsO_Namespan" :class="{hidden: item.bsO_Namedis}">{{item.bsO_Name}}</td>
 <td width="8%" :rowspan="item.GathDtspan" :class="{hidden: item.GathDtdis}" :class="{overtime: overtime(item.GathDt)}">{{item.GathDt | time}}</td>
 <td width="5%" :rowspan="item.F1span"  :class="{hidden: item.F1dis}">{{item.F1}}</td>
 <td width="5%" :rowspan="item.F2span"  :class="{hidden: item.F2dis}">{{item.F2}}</td>
 <td width="5%" :rowspan="item.F3span"  :class="{hidden: item.F3dis}">{{item.F3}}</td>
 <td width="5%" :rowspan="item.F4span"  :class="{hidden: item.F4dis}">{{item.F4}}</td>
 <td width="5%" :rowspan="item.F5span"  :class="{hidden: item.F5dis}">{{item.F5}}</td>
 <td width="10%" :rowspan="item.F6span"  :class="{hidden: item.F6dis}">{{item.F6}}</td>
 <td width="8%" :rowspan="item.F7span"  :class="{hidden: item.F7dis}" :class="{overtime: overtime(item.F7)}">{{item.F7 | time}}</td>
 <td width="5%" :rowspan="item.F8span"  :class="{hidden: item.F8dis}">{{item.F8}}</td>
 <td width="5%" :rowspan="item.F9span"  :class="{hidden: item.F9dis}">{{item.F9}}</td>
 <td width="5%" :rowspan="item.F10span"  :class="{hidden: item.F10dis}">{{item.F10}}</td>
 <td width="5%" :rowspan="item.F11span"  :class="{hidden: item.F11dis}">{{item.F11}}</td>
</tr>

其中,这两个属性有一些特征:

要显示的单元格rowspan为>1的值,记录接下来的行数

要显示的单元格displaytrue

接下来不显示的单元格rowspan为1且displayfalse

只有一行数据的单元格rowspan为1且displaytrue

实际上就是设计一个算法,对于输入的表格数组,每个数据项添加两个属性,rowspandisplay,并且计算出rowspan的值为

本列中以下相同值的行数,以及依据rowspan的值计算display的值是否显示,最后将此改变后的数组输出。

解决示例代码

function combineCell(list) {
 for (field in list[0]) {
  var k = 0;
  while (k < list.length) {
   list[k][field + 'span'] = 1;
   list[k][field + 'dis'] = false;
   for (var i = k + 1; i <= list.length - 1; i++) {
    if (list[k][field] == list[i][field] && list[k][field] != '') {
     list[k][field + 'span']++;
     list[k][field + 'dis'] = false;
     list[i][field + 'span'] = 1;
     list[i][field + 'dis'] = true;
    } else {
     break;
    }
   }
   k = i;
  }
 }
 return list;
}

总结

代码实际上很短很简单,主要借助的是kmp的思想,定义一个指针k,开始指向第一个值,然后向下比较,以此对rowspandisplay设置,

若遇到不相同的值则判断为跳出,进行下一个循环,通知指针k加上这个过程中运算的行数,进行跳转,然后比较下一个单元格的值,和kmp的指针跳转判断相同字符串一样的原理。

通过combineCell()这个函数就可以将网络请求回来的数据进行过滤,附加上相应的值后再对vue监视的数组进行赋值操作就可以了。

实际上此方法不仅适用于vue,数据驱动的框架都可以,包括Angular和React,要想实现表格合并,对请求回来的值过滤一下就OK。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
Jan 15 Javascript
jquery 动态创建元素的方式介绍及应用
Apr 21 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
Apr 26 Javascript
使用Math.floor与Math.random取随机整数的方法详解
May 07 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
Jan 13 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
Summernote实现图片上传功能的简单方法
Jul 11 Javascript
Vue.js 表单控件操作小结
Mar 29 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
May 31 Javascript
vue2.0实现列表数据增加和删除
Jun 17 Javascript
通过实例了解Render Props回调地狱解决方案
Nov 04 Javascript
浅谈jquery的html方法里包含特殊字符的处理
Nov 30 #Javascript
Javascript 闭包详解及实例代码
Nov 30 #Javascript
jQuery特殊符号转义的实现
Nov 30 #Javascript
Javascript 引擎工作机制详解
Nov 30 #Javascript
将JSON字符串转换成Map对象的方法
Nov 30 #Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 #Javascript
JS实现重新加载当前页面
Nov 29 #Javascript
You might like
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
整理Javascript基础语法学习笔记
2015/11/29 Javascript
js实现网页收藏功能
2015/12/17 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
2016/08/31 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
js闭包用法实例详解
2016/12/13 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
JavaScript中filter的用法实例分析
2019/02/27 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
python Plotly绘图工具的简单使用
2020/03/03 Python
python正则表达式实例代码
2020/03/03 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
2020/08/02 Python
python GUI计算器的实现
2020/10/09 Python
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
超市端午节活动方案
2014/01/23 职场文书
周年庆典邀请函范文
2014/01/24 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js