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中动态修改css其中一个属性值操作
Dec 07 Vue.js
Vue——前端生成二维码的示例
Dec 19 Vue.js
vue+element UI实现树形表格
Dec 29 Vue.js
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
Vue常用API、高级API的相关总结
Feb 02 Vue.js
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
vue3.0中使用element的完整步骤
Mar 04 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
Vue全局事件总线你了解吗
Feb 24 Vue.js
Vue Mint UI mt-swipe的使用方式
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
PHP模块memcached使用指南
2014/12/08 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
jQuery 通过事件委派一次绑定多种事件,以减少事件冗余
2010/06/30 Javascript
js 中 document.createEvent的用法
2010/08/29 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
jQuery获取父元素节点、子元素节点及兄弟元素节点的方法
2016/04/14 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
JS鼠标滚动分页效果示例
2017/07/05 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
Python编程中NotImplementedError的使用方法
2018/04/21 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
Python气泡提示与标签的实现
2020/04/01 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书
走进科学观后感
2015/06/18 职场文书
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers