vue中Element-ui 表格 (Table)合并行、列单元格

这篇具有很好参考价值的文章主要介绍了vue中Element-ui 表格 (Table)合并行、列单元格。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现效果

elementui合并列单元格,vue.js,ui,javascript

实现方式

先在el-table里加个属性:span-method绑定方法objectSpanMethod(),这个用来把你想合并的列根据你写的逻辑来合并,再写个getSpanArr(),这个写合并的逻辑。

快速应用

加一个属性两个方法,然后在获取表格数据的时候调用一下getSpanArr(),示例代码写了四个逻辑,根据id相同合并,根据id和其他字段相同登则进行合并,执行完后会得到四个tableArr数组,记录了每个逻辑需要合并的列数,objectSpanMethod()里根据你的合并逻辑来合并这些列,哪些列是用哪个逻辑你就用哪个数组,改成你想要的模样。

注意事项

你的后端传过来的数据要排序好,因为getSpanArr()里是判断当前元素与上一个元素是否相同来进行合并的。

代码实现

<el-table
      v-loading="loading"
      :data="tableData"
      @selection-change="handleSelectionChange"
      highlight-current-row
      style="width: 100%"
      :span-method="objectSpanMethod"
      stripe
    >
// 数据指定列动态合并行
    getSpanArr() {
      // 把需要合并行的归类, this.xxx是表格数据
      this.tableOneArr = [];
      this.tableOnePos = 0;
      this.tableTwoArr = [];
      this.tableTwoPos = 0;
      this.tableThreeArr = [];
      this.tableThreePos = 0;
      this.tableFourArr = [];
      this.tableFourPos = 0;
      for (var i = 0; i < this.tableData.length; i++) {
        if (i === 0) {
          // 第一行必须存在
          this.tableOneArr.push(1);
          this.tableOnePos = 0;
          this.tableTwoArr.push(1);
          this.tableTwoPos = 0;
          this.tableThreeArr.push(1);
          this.tableThreePos = 0;
          this.tableFourArr.push(1);
          this.tableFourPos = 0;
        } else {
          // 判断当前元素与上一个元素是否相同
          if (this.tableData[i].id === this.tableData[i - 1].id) {
            this.tableOneArr[this.tableOnePos] += 1;
            this.tableOneArr.push(0);
          } else {
            this.tableOneArr.push(1);
            this.tableOnePos = i;
          }
          //判断当前元素是否与上一元素相同且为空
          if (this.tableData[i].id === this.tableData[i - 1].id &&
          this.tableData[i].itemNum === null && this.tableData[i].itemStdName === null && this.tableData[i].testMethod === null && this.tableData[i].stdChName === null && this.tableData[i].testCycle === null && this.tableData[i].splQty === null && this.tableData[i].subcCycle === null && this.tableData[i].priceInclTax === null && this.tableData[i].priceExTax === null && this.tableData[i].remark === null) {
            this.tableTwoArr[this.tableTwoPos] += 1;
            this.tableTwoArr.push(0);
          } else {
            this.tableTwoArr.push(1);
            this.tableTwoPos = i;
          }
          //判断当前元素是否与上一元素相同且为空
          if (this.tableData[i].id === this.tableData[i - 1].id &&
          this.tableData[i].contractNo === null) {
            this.tableThreeArr[this.tableThreePos] += 1;
            this.tableThreeArr.push(0);
          } else {
            this.tableThreeArr.push(1);
            this.tableThreePos = i;
          }
          //判断当前元素是否与上一元素相同且为空
          if (this.tableData[i].id === this.tableData[i - 1].id &&
          this.tableData[i].qualName === null && this.tableData[i].qualNum === null && this.tableData[i].deadline === null) {
            this.tableFourArr[this.tableFourPos] += 1;
            this.tableFourArr.push(0);
          } else {
            this.tableFourArr.push(1);
            this.tableFourPos = i;
          }
        }
      }
      // 表格序号
      let numSort = 0
      for (const n in this.tableOneArr) {
        if (this.tableOneArr[n] > 0) {
          numSort += 1
          this.$set(this.tableData[n], 'numSort', numSort)
        }
      }
    },
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (
        columnIndex === 0 || columnIndex === 1 || columnIndex === 2 || columnIndex === 3 || columnIndex === 15 || columnIndex === 19 || columnIndex === 20 || columnIndex === 21
      ) {
        // 第一列的合并方法,省
        const _row = this.tableOneArr[rowIndex]
        const _col = _row > 0 ? 1 : 0 // 如果被合并了_row=0则它这个列需要取消
        return {
          rowspan: _row,
          colspan: _col
        }
      }else if(
        columnIndex === 4 || columnIndex === 5 || columnIndex === 6 ||columnIndex === 7 ||  columnIndex === 8 || columnIndex === 9 || columnIndex === 10 || columnIndex === 11 || columnIndex === 12 || columnIndex === 13
      ){
        const _row = this.tableTwoArr[rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }else if(
        columnIndex === 14
      ){
         const _row = this.tableThreeArr[rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }else if(
        columnIndex === 16 || columnIndex === 17 || columnIndex === 18
      ){
        const _row = this.tableFourArr[rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }
    },

详细说明

getSpanArr()这个函数就是用来返回 spanArr 数组的,定义每一行的 rowspan

if( index === 0),第一行,直接先给数组 push 进一个1,表示自己先占一行,position 是数组元素的位置
(此时是从数组元素的第一个开始,所以position 为 0), position为 0 意思表示的就是数组的第一个元素。

当到了 index 为 2 的时候,if(this.tableData[i].id === this.tableData[i - 1].id),
让第二行与第一行作比较:
(1)如果第二行与第一行相等的话,position 就 +1,当有 n 行第一行相同,position 就为 n,表示向下合并 n 行;
第二行自己就 spanArr.push(0),表示第二行“消失”,因为第一行和第二行合并了;
(2)如果第二行与第一行不相等的话,那么 spanArr.push(1);就让第二行自己独占一行;

position = index :把指针拿到 index 这行来,表示设置数组 spanArr[position] 的元素值,然后定义从此行开始向下合并几行
(可以根据示例研究下,当 index 为 2 时,position 为 2,当 index 为 3 时,第四行与第三行需要合并,
那么在数组的 position 元素就要 +1 了,也就是 spanArr[position] += 1
:span-method="objectSpanMethod" 

这个是官方给定的绑定属性和对应的方法,objectSpanMethod 传入了 { row, column, rowIndex, columnIndex }
row: 当前行
column: 当前列
rowIndex:当前行号
columnIndex :当前列号

该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素代表 colspan。
也可以返回一个键名为 rowspan 和 colspan 的对象。

const _col = _row > 0 ? 1 : 0;  定义的这个单元格列的合并,我们项目只合并行,不合并列;

_row:代表合并行的行数,_row 的值要么是 1,或者更大的自然正整数,要么是 01代表:独占一行
更大的自然数:代表合并了若干行
0:代表“消失”的哪那一个单元格,后面的单元格向前推一格


vue中Element-ui 表格 (Table)合并行、列单元格文章来源地址https://www.toymoban.com/news/detail-692497.html

到了这里,关于vue中Element-ui 表格 (Table)合并行、列单元格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • element-ui 表格(table)合并表头下面合并列且可以收缩展开

    百度了一大堆,发现了首行不能合并,想到了用dom做,找到了下面这个链接 1、表头合并 —— 给table添加属性:header-cell-style=\\\"headerStyle\\\",里面给首行设置跨行 element-ui表头合并 - ^Mao^ - 博客园 2、表内合并 —— 给table添加属性:span-method=\\\"arraySpanMethod\\\",里面设置合并 Element - The wor

    2024年02月16日
    浏览(41)
  • element-ui中的el-table合并单元格

    在写项目的时候有时候会经常遇到把行和列合并起来的情况,因为有些数据是重复渲染的,不合并行列会使表格看起来非常的混乱,如下:  而我们想要的数据是下面这种情况,将重复的行进行合并,使表格看起来简单明了,如下:   1:html部分 所谓的合并行就是将多行相同

    2024年02月10日
    浏览(30)
  • element-ui el-table 如何实现合并单元格

    el-table的组件的可以合并单元格,先定义参数span-method 方法objectSpanMethod。在方法内控制当前单元格渲染成几个单元格或者删除掉当前单元格。 比如:代码中定义:span-method=\\\"objectSpanMethod\\\" objectSpanMethod实现是在方法区,具体内容是根据变量rowSpanList 去决定当前单元格是展示还是删

    2024年02月03日
    浏览(34)
  • [element-ui] el-table表格合并 span-method

    element 中表格合并 span-method 函数详解

    2024年02月13日
    浏览(40)
  • Vue Element-ui Table表格排序

    一.表格中有时候会有排序的需求,如果只针对当前页进行排序,那么前端就可以实现排序,在对应需要排序的字段中,使用sortable字段即可。 二.存在分页的情况时,前端仅仅使用sortable当前页排序已经不能满足我们的需求,无法对所有数据进行排序。这时候我们就要使用后端

    2024年02月11日
    浏览(37)
  • 前端vue+elementui导出复杂(单元格合并,多级表头)表格el-table转为excel导出

    需求 :前端对el-table表格导出 插件 : npm install xlsx -S npm install file-saver --save 原理 :直接导出el-table的表格里面的数据,这样就会存在缺点,只会导出当前页面的数据,如果需要导出全部数据,可以自己重新渲染一个全部数据不可见的el-table表格,来导出就可以了 扩展 :经过

    2024年02月04日
    浏览(54)
  • vue监听element-ui的table表格滚动事件

    这篇文章主要是讲述“如何监听element-ui table滚动事件”,按我自己尝试的方法去实现。 需求分析: 前两天做项目遇到一个问题,数据量大,然后表格渲染的很慢,而且很卡怎么办?有什么优化的方式? 那无非就是两种方法。 先加载一屏表格的数据,之后触底加载新的数据

    2024年02月12日
    浏览(42)
  • vue中element-ui表格组件el-table封装,在table表格中插入图片

            这次写的项目是写后台管理系统这部分,对于后台管理使用vue写,用组件的话,table组件用得次数比较多,可以封装一个table组件。         1.如封装的table组件:  :prop=\\\"item.prop\\\"  :label=\\\"item.label\\\"是必须要有的,其他的可以根据自己需要写 。 2.封装之后是就是使

    2024年02月15日
    浏览(40)
  • vue element ui 表格有相同数据合并单元格

    先看效果     前提是你的数据是扁平的数据因为要根据上下数据是否一样才合并的  如果是子级数据需要改一下数据格式了 下面是数据的样式    合并单元格的重点属性就是 :summary-method=\\\"\\\" 这个是关键 完整代码

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包