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 相关文章推荐
JQuery 学习笔记 选择器之三
Jul 23 Javascript
javascript 循环调用示例介绍
Nov 20 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
js带前后翻页的图片切换效果代码分享
Sep 08 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
Mar 28 Javascript
jQuery.form插件的使用及跨域异步上传文件
Apr 27 Javascript
vue-router:嵌套路由的使用方法
Feb 21 Javascript
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 jQuery
如何实现一个简易版的vuex持久化工具
Sep 11 Javascript
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
浅谈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
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
2019/10/15 PHP
js 对象是否存在判断
2009/07/15 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
浅说js变量
2011/05/25 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
JavaScript知识点整理
2015/12/09 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python学习之Django的管理界面代码示例
2018/02/10 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
Django 限制访问频率的思路详解
2019/12/24 Python
python实现人工蜂群算法
2020/09/18 Python
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
外企办公室竞聘演讲稿
2013/12/29 职场文书
目标责任书范本
2014/04/16 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
2015年考研复习计划
2015/01/19 职场文书
给老婆的检讨书
2015/01/27 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
技术员岗位职责范本
2015/04/11 职场文书
八年级英语教学反思
2016/02/15 职场文书
小学信息技术教学反思
2016/02/16 职场文书