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+element实现动态加载表单
Dec 13 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
vue中使用echarts的示例
Jan 03 Vue.js
vue中axios封装使用的完整教程
Mar 03 Vue.js
Vue项目中如何封装axios(统一管理http请求)
May 02 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
vue实现水波涟漪效果的点击反馈指令
May 31 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
vue实现移动端div拖动效果
Mar 03 Vue.js
解决vue自定义组件@click点击失效问题
Apr 30 Vue.js
vue递归实现树形组件
Jul 15 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
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
Prototype 工具函数 学习
2009/07/23 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
判断多个input type=file是否有已经选择好文件的代码
2012/05/23 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
nuxt 实现在其它js文件中使用store的方式
2020/11/05 Javascript
21行Python代码实现拼写检查器
2016/01/25 Python
打包发布Python模块的方法详解
2016/09/18 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
python实现公司年会抽奖程序
2019/01/22 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
马来西亚太阳镜、眼镜和隐形眼镜网上商店:Focus Point
2018/12/13 全球购物
小区门卫岗位职责
2013/12/31 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
MySQL添加索引特点及优化问题
2022/07/23 MySQL
详解flex:1什么意思
2022/07/23 HTML / CSS