vue实现表格合并功能


Posted in Vue.js onDecember 01, 2020

本文实例为大家分享了vue实现表格合并功能的具体代码,供大家参考,具体内容如下

1、背景

本身有vue进行渲染的数据表格,,但是出于整体考虑,需要对相同的列信息进行单元格合并。

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

vue实现表格合并功能

2、思路

原本的正常表格是这样的:

<table >
      <thead>
        <tr>
          <th>设备</th>
          <th>工单</th>
          <th>产品型号</th>
          <th>计划/实际</th>
          <th>状态</th>
          <th>预计生产数</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in testData">
          <td>{{ item.equipmentName }}</td>
          <td>{{ item.doCode}}</td>
          <td>{{ item.materialCode}}</td>
          <td>{{ item.productionNum}}</td>
          <td>{{ item.status}}</td>
          <td>{{ item.pNum}}</td>
        </tr>
      </tbody>
</table>

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

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

因此,每个<td>标签需要带有两个属性值,rowspan和display来控制每一个单元格的合并行数和是否显示。代码变成这样了

<table >
      <thead>
        <tr>
          <th>设备</th>
          <th>工单</th>
          <th>产品型号</th>
          <th>计划/实际</th>
          <th>状态</th>
          <th>预计生产数</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in testData">
          <td :rowspan="item.equipmentNamespan" :class="{hidden: item.equipmentNamedis}">{{ item.equipmentName }}</td>
          <td :rowspan="item.doCodespan" :class="{hidden: item.doCodedis}">{{ item.doCode}}</td>
          <td :rowspan="item.materialCodespan" :class="{hidden: item.materialCodedis}">{{ item.materialCode}}</td>
          <td :rowspan="item.productionNumspan" :class="{hidden: item.productionNumdis}">{{ item.productionNum}}</td>
          <td :rowspan="item.statusspan" :class="{hidden: item.statusdis}">{{ item.status}}</td>
          <td :rowspan="item.pNumspan" :class="{hidden: item.pNumdis}">{{ item.pNum}}</td>
        </tr>
      </tbody>
</table>

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

要显示的单元格rowspan为>1的值,记录接下来的行数
要显示的单元格display为true
接下来不显示的单元格rowspan为1且display为false
只有一行数据的单元格rowspan为1且display为true
实际上就是设计一个算法,对于输入的表格数组,每个数据项添加两个属性,rowspan和display,并且计算出**rowspan的值为
本列中以下相同值的行数,以及依据rowspan的值计算display的值是否显示**,最后将此改变后的数组输出。

3、code

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;
}

4 写在最后

代码实际上很短很简单,主要借助的是kmp的思想,定义一个指针k,开始指向第一个值,然后向下比较,以此对rowspan和display设置,若遇到不相同的值则判断为跳出,进行下一个循环,通知指针k加上这个过程中运算的行数,进行跳转,然后比较下一个单元格的值,和kmp的指针跳转判断相同字符串一样的原理。

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
如何实现vue的tree组件
Dec 03 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
vue浏览器返回监听的具体步骤
Feb 03 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
vue实现可拖拽的dialog弹框
May 13 Vue.js
Vue的过滤器你真了解吗
Feb 24 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue中data里面的数据相互使用方式
Jun 05 Vue.js
vue element实现表格合并行数据
Nov 30 #Vue.js
Vue Elenent实现表格相同数据列合并
Nov 30 #Vue.js
vue中defineProperty和Proxy的区别详解
Nov 30 #Vue.js
详解Vue 的异常处理机制
Nov 30 #Vue.js
ESLint 是如何检查 .vue 文件的
Nov 30 #Vue.js
Vue用mixin合并重复代码的实现
Nov 27 #Vue.js
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 #Vue.js
You might like
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
firefox浏览器下javascript 拖动层效果与原理分析代码
2007/12/04 Javascript
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
vue.js做一个简单的编辑菜谱功能
2018/05/08 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
layui-laydate时间日历控件使用方法详解
2018/11/15 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
python 连续不等式语法糖实例
2020/04/15 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
新闻记者实习自我鉴定
2013/09/19 职场文书
人事专员的岗位职责
2014/03/01 职场文书
制冷与空调专业毕业生推荐信
2014/07/07 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL