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防抖与节流
Nov 24 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
vue绑定class的三种方法
Dec 24 Vue.js
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
vue+django实现下载文件的示例
Mar 24 Vue.js
vue如何批量引入组件、注册和使用详解
May 12 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学习笔记之二
2011/01/17 PHP
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
2016/03/18 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
jquery获取iframe中的dom对象(两种方法)
2013/07/02 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
举例介绍Python中的25个隐藏特性
2015/03/30 Python
python写入中英文字符串到文件的方法
2015/05/06 Python
Python操作MySQL数据库9个实用实例
2015/12/11 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
python实现PCA降维的示例详解
2020/02/24 Python
优秀教师的感人事迹
2014/02/04 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
火箭队口号
2014/06/18 职场文书
让世界充满爱观后感
2015/06/10 职场文书
获奖感言怎么写
2015/07/31 职场文书
中学团支部工作总结
2015/08/13 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python