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 Elenent实现表格相同数据列合并
Nov 30 Vue.js
浅析vue中的nextTick
Dec 28 Vue.js
Vue实现简易购物车页面
Dec 30 Vue.js
vue-video-player 断点续播的实现
Feb 01 Vue.js
vue首次渲染全过程
Apr 21 Vue.js
详解Vue router路由
Nov 20 Vue.js
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
一起来看看Vue的核心原理剖析
Mar 24 Vue.js
Vue3中toRef与toRefs的区别
Mar 24 Vue.js
Vue操作Storage本地化存储
Apr 29 Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
vue使用watch监听属性变化
Apr 30 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
Element-UI+Vue模式使用总结
2020/01/02 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
python 获取文件列表(或是目录例表)
2009/03/25 Python
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
python编写俄罗斯方块
2020/03/13 Python
Django models文件模型变更错误解决
2020/05/11 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
打架检讨书50字
2014/01/11 职场文书
运动会入场词50字
2014/02/20 职场文书
代收款委托书范本
2014/10/01 职场文书
法人代表证明书格式
2014/10/01 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
教研活动主持词
2015/07/03 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python