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+openlayers绘制省市边界线
Dec 24 Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 Vue.js
开发一个封装iframe的vue组件
Mar 29 Vue.js
vue3中的组件间通信
Mar 31 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
Vue的列表之渲染,排序,过滤详解
Feb 24 Vue.js
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
vue+elementUI实现表格列的显示与隐藏
Apr 13 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
php字符串截取问题
2006/11/28 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
vue路由懒加载的实现方法
2018/03/12 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
layui获取选中行数据的实例讲解
2018/08/19 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
从零学Python之入门(四)运算
2014/05/27 Python
python判断字符串是否是json格式方法分享
2017/11/07 Python
Python实现矩阵转置的方法分析
2017/11/24 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
conda安装tensorflow和conda常用命令小结
2021/02/20 Python
携程英文网站:Trip.com
2017/02/07 全球购物
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
英语国培研修感言
2014/02/13 职场文书
真诚的求职信
2014/07/04 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
医院病假条范文
2015/08/17 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
八年级语文教学反思
2016/03/03 职场文书
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记