Vue - vxe-table 表格合并行应用

news2024/12/24 2:08:20

Vue - vxe-table 表格合并行应用

  • 一. 将相同的列数据合并为一行
    • 实现效果
    • 实现方法
  • 二. 拓展合并:根据某个字段合并后的数据 进行合并其他字段列
    • 实现效果
    • 实现方法

vxe-table 地址:https://vxetable.cn/v2/#/table/start/install

一. 将相同的列数据合并为一行

实现效果

在这里插入图片描述

实现方法

使用 API 中的 span-method 方法:

在这里插入图片描述

  1. span-method 使用方法
    <vxe-grid
      border
      resizable
      align="center"
      :columns="tableColumn"
      :data="tableData"
      :span-method="rowspanMethod"
    >
    </vxe-grid>
    
    // 将相同的列数据合并为一行
    rowspanMethod({ row, _rowIndex, column, visibleData }) {
      // 需要合并的列字段
      let fields = [];
      const cellValue = row[column.property];
      if (cellValue && fields.includes(column.property)) {
        const prevRow = visibleData[_rowIndex - 1];
        let nextRow = visibleData[_rowIndex + 1];
        if (prevRow && prevRow[column.property] === cellValue) {
          return { rowspan: 0, colspan: 0 };
        } else {
          let countRowspan = 1;
          while (nextRow && nextRow[column.property] === cellValue) {
            nextRow = visibleData[++countRowspan + _rowIndex];
          }
          if (countRowspan > 1) {
            return { rowspan: countRowspan, colspan: 1 };
          }
        }
      }
    }
    
  2. 完整代码
    <template>
      <div class="page">
        <vxe-grid
          border
          resizable
          align="center"
          :columns="tableColumn"
          :data="tableData"
          :span-method="rowspanMethod"
        >
        </vxe-grid>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          tableColumn: [
            { type: "seq", field: "seq", width: 50 },
            { field: "bus", title: "公交班次" },
            { field: "upDown", title: "上下行" },
            { field: "strStation", title: "进站" },
            { field: "endStation", title: "出站" },
            { field: "guestNum", title: "上下行总客数" }
          ],
          tableData: [
            {
              bus: "1路",
              upDown: "上行",
              strStation: "B站",
              endStation: "A站",
              guestNum: 98
            },
            {
              bus: "1路",
              upDown: "下行",
              strStation: "A站",
              endStation: "B站",
              guestNum: 98
            },
            {
              bus: "2路",
              upDown: "下行",
              strStation: "C站",
              endStation: "B站",
              guestNum: 95
            },
            {
              bus: "2路",
              upDown: "上行",
              strStation: "B站",
              endStation: "C站",
              guestNum: 95
            },
            {
              bus: "3路",
              upDown: "上行",
              strStation: "B站",
              endStation: "D站",
              guestNum: 95
            },
            {
              bus: "3路",
              upDown: "下行",
              strStation: "D站",
              endStation: "B站",
              guestNum: 95
            },
            {
              bus: "4路",
              upDown: "下行",
              strStation: "D站",
              endStation: "C站",
              guestNum: 102
            },
            {
              bus: "4路",
              upDown: "上行",
              strStation: "C站",
              endStation: "D站",
              guestNum: 102
            }
          ]
        };
      },
      methods: {
        // 将相同的列数据合并为一行
        rowspanMethod({ row, _rowIndex, column, visibleData }) {
          // 需要合并的列字段
          let fields = ["bus", "upDown", "strStation", "endStation", "guestNum"];
          const cellValue = row[column.property];
          if (cellValue && fields.includes(column.property)) {
            const prevRow = visibleData[_rowIndex - 1];
            let nextRow = visibleData[_rowIndex + 1];
            if (prevRow && prevRow[column.property] === cellValue) {
              return { rowspan: 0, colspan: 0 };
            } else {
              let countRowspan = 1;
              while (nextRow && nextRow[column.property] === cellValue) {
                nextRow = visibleData[++countRowspan + _rowIndex];
              }
              if (countRowspan > 1) {
                return { rowspan: countRowspan, colspan: 1 };
              }
            }
          }
        }
      }
    };
    </script>
    <style scoped>
    .page {
      width: 100%;
      height: 100%;
      padding: 20px;
      box-sizing: border-box;
    }
    </style>
    

二. 拓展合并:根据某个字段合并后的数据 进行合并其他字段列

需求: 排序字段 根据 公交班次 合并后的数据进行排序,上下行总客数 根据 公交班次 合并后的数据

实现效果

在这里插入图片描述

实现方法

使用 API 中的 span-methodseq-config 方法:

在这里插入图片描述
在这里插入图片描述

  1. span-methodseq-config 使用方法

    <vxe-grid
      border
      resizable
      align="center"
      :columns="tableColumn"
      :data="tableData"
      :span-method="rowspanMethod"
      :seq-config="{ seqMethod }"
    >
    </vxe-grid>
    

    columns 列配置 中的排序项 需要添加field: "seq"

    tableColumn: [
      { type: "seq", field: "seq", width: 50 },
      { field: "bus", title: "公交班次" },
      { field: "upDown", title: "上下行" },
      { field: "strStation", title: "进站" },
      { field: "endStation", title: "出站" },
      { field: "guestNum", title: "上下行总客数" }
    ],
    
    /**
     *自定义合并:根据某个字段合并后的数据 进行合并其他字段列
     */
    rowspanMethod({
      row,
      items,
      seq,
      rowIndex,
      $rowIndex,
      _rowIndex,
      column,
      visibleData,
      data
    }) {
      /**
       * 相同的列数据 自定义合并
       * 此处自定义合并的字段:seq、guestNum
       * 此处的合并参考字段:bus
       */
      if (column.property === "seq") {
        // 合并参考字段,根据此字段进行合并行
        const referenceField = "bus";
        if (rowIndex > 0) {
          if (row[referenceField] === items[rowIndex - 1][referenceField]) {
            row.seq = items[rowIndex - 1].seq;
          } else {
            row.seq = items[rowIndex - 1].seq + 1;
          }
        } else if (rowIndex === 0) {
          row.seq = seq;
        }
        let prevRow = data[$rowIndex - 1];
        let nextRow = data[$rowIndex + 1];
        if (prevRow && prevRow[referenceField] === row[referenceField]) {
          return { rowspan: 0, colspan: 0 };
        } else {
          let countRowspan = 1;
          while (nextRow && nextRow[referenceField] === row[referenceField]) {
            nextRow = data[++countRowspan + $rowIndex];
          }
          if (countRowspan > 1) {
            return { rowspan: countRowspan, colspan: 1 };
          }
        }
      } else {
        /**
         * 相同的列数据 默认合并
         * 此处合并的列字段:["bus"]
         */
        // 需要合并的列字段
        let fields = ["bus"];
        const cellValue = row[column.property];
        if (cellValue && fields.includes(column.property)) {
          const prevRow = visibleData[_rowIndex - 1];
          let nextRow = visibleData[_rowIndex + 1];
          if (prevRow && prevRow[column.property] === cellValue) {
            return { rowspan: 0, colspan: 0 };
          } else {
            let countRowspan = 1;
            while (nextRow && nextRow[column.property] === cellValue) {
              nextRow = visibleData[++countRowspan + _rowIndex];
            }
            if (countRowspan > 1) {
              return { rowspan: countRowspan, colspan: 1 };
            }
          }
        }
      }
    },
    /**
     * 自定义排序
     * 此处的合并参考字段:bus
     */
    seqMethod(obj) {
      // 合并参考字段
      const referenceField = "bus";
      obj.row.seq = obj.seq;
      if (obj.rowIndex > 0) {
        if (obj.seq - obj.items[obj.rowIndex - 1].seq > 1) {
          if (
            obj.row[referenceField] ===
            obj.items[obj.rowIndex - 1][referenceField]
          ) {
            obj.row.seq = obj.items[obj.rowIndex - 1].seq;
            return obj.items[obj.rowIndex - 1].seq;
          } else {
            obj.row.seq = obj.items[obj.rowIndex - 1].seq + 1;
            return obj.items[obj.rowIndex - 1].seq + 1;
          }
        } else {
          obj.row.seq = obj.items[obj.rowIndex - 1].seq + 1;
          return obj.items[obj.rowIndex - 1].seq + 1;
        }
      } else {
        return obj.seq;
      }
    }
    
  2. 完整代码

    <template>
      <div class="page">
        <vxe-grid
          border
          resizable
          align="center"
          :columns="tableColumn"
          :data="tableData"
          :span-method="rowspanMethod"
          :seq-config="{ seqMethod }"
        >
        </vxe-grid>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          tableColumn: [
            { type: "seq", field: "seq", width: 50 },
            { field: "bus", title: "公交班次" },
            { field: "upDown", title: "上下行" },
            { field: "strStation", title: "进站" },
            { field: "endStation", title: "出站" },
            { field: "guestNum", title: "上下行总客数" }
          ],
          tableData: [
            {
              bus: "1路",
              upDown: "上行",
              strStation: "B站",
              endStation: "A站",
              guestNum: 98
            },
            {
              bus: "1路",
              upDown: "下行",
              strStation: "A站",
              endStation: "B站",
              guestNum: 98
            },
            {
              bus: "2路",
              upDown: "下行",
              strStation: "C站",
              endStation: "B站",
              guestNum: 95
            },
            {
              bus: "2路",
              upDown: "上行",
              strStation: "B站",
              endStation: "C站",
              guestNum: 95
            },
            {
              bus: "3路",
              upDown: "上行",
              strStation: "B站",
              endStation: "D站",
              guestNum: 95
            },
            {
              bus: "3路",
              upDown: "下行",
              strStation: "D站",
              endStation: "B站",
              guestNum: 95
            },
            {
              bus: "4路",
              upDown: "下行",
              strStation: "D站",
              endStation: "C站",
              guestNum: 102
            },
            {
              bus: "4路",
              upDown: "上行",
              strStation: "C站",
              endStation: "D站",
              guestNum: 102
            }
          ]
        };
      },
      methods: {
        /**
         *自定义合并:根据某个字段合并后的数据 进行合并其他字段列
         */
        rowspanMethod({
          row,
          items,
          seq,
          rowIndex,
          $rowIndex,
          _rowIndex,
          column,
          visibleData,
          data
        }) {
          /**
           * 相同的列数据 自定义合并
           * 自定义合并的字段:seq、guestNum
           * 此处的合并参考字段:bus
           */
          if (column.property === "seq" || column.property === "guestNum") {
            // 合并参考字段,根据此字段进行合并行
            const referenceField = "bus";
            if (rowIndex > 0) {
              if (row[referenceField] === items[rowIndex - 1][referenceField]) {
                row.seq = items[rowIndex - 1].seq;
              } else {
                row.seq = items[rowIndex - 1].seq + 1;
              }
            } else if (rowIndex === 0) {
              row.seq = seq;
            }
            let prevRow = data[$rowIndex - 1];
            let nextRow = data[$rowIndex + 1];
            if (prevRow && prevRow[referenceField] === row[referenceField]) {
              return { rowspan: 0, colspan: 0 };
            } else {
              let countRowspan = 1;
              while (nextRow && nextRow[referenceField] === row[referenceField]) {
                nextRow = data[++countRowspan + $rowIndex];
              }
              if (countRowspan > 1) {
                return { rowspan: countRowspan, colspan: 1 };
              }
            }
          } else {
            /**
             * 相同的列数据 默认合并
             * 此处合并的列字段:["bus"]
             */
            // 需要合并的列字段
            let fields = ["bus"];
            const cellValue = row[column.property];
            if (cellValue && fields.includes(column.property)) {
              const prevRow = visibleData[_rowIndex - 1];
              let nextRow = visibleData[_rowIndex + 1];
              if (prevRow && prevRow[column.property] === cellValue) {
                return { rowspan: 0, colspan: 0 };
              } else {
                let countRowspan = 1;
                while (nextRow && nextRow[column.property] === cellValue) {
                  nextRow = visibleData[++countRowspan + _rowIndex];
                }
                if (countRowspan > 1) {
                  return { rowspan: countRowspan, colspan: 1 };
                }
              }
            }
          }
        },
        /**
         * 自定义排序
         * 此处的合并参考字段:bus
         */
        seqMethod(obj) {
          // 合并参考字段
          const referenceField = "bus";
          obj.row.seq = obj.seq;
          if (obj.rowIndex > 0) {
            if (obj.seq - obj.items[obj.rowIndex - 1].seq > 1) {
              if (
                obj.row[referenceField] ===
                obj.items[obj.rowIndex - 1][referenceField]
              ) {
                obj.row.seq = obj.items[obj.rowIndex - 1].seq;
                return obj.items[obj.rowIndex - 1].seq;
              } else {
                obj.row.seq = obj.items[obj.rowIndex - 1].seq + 1;
                return obj.items[obj.rowIndex - 1].seq + 1;
              }
            } else {
              obj.row.seq = obj.items[obj.rowIndex - 1].seq + 1;
              return obj.items[obj.rowIndex - 1].seq + 1;
            }
          } else {
            return obj.seq;
          }
        }
      }
    };
    </script>
    <style scoped>
    .page {
      width: 100%;
      height: 100%;
      padding: 20px;
      box-sizing: border-box;
    }
    </style>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊云科技作为中国出海力量之一,为中国企业提供技术桥梁

这是一个真实的故事&#xff1a;一家出海企业的项目交付需要在非洲吉布提部署上云&#xff0c;企业负责人在地图上找了半天才找到吉布提&#xff0c;而亚马逊云科技仅用了3天的时间就为企业在当地的业务开展&#xff0c;交付了IT基础设施。对于出海企业来说&#xff0c;这种效率…

前端学习--Vue(2)常见指令

一、Vue简介 1.1 概念 Vue是一套用于构建用户界面的前端框架 框架&#xff1a;现成解决方案&#xff0c;遵守规范去编写业务功能 指令、组件、路由、Vuex、vue组件库 1.2 特性 数据驱动视图 vue连接页面结构和数据&#xff0c;监听数据变化&#xff0c;自动渲染页面结构…

【遗传算法】【处理图像类问题】

文章目录 一、前言二、问题描述三、算法介绍四、其他知识点Reference 一、前言 近期感兴趣的算法&#xff0c;以前没这么好奇过一个算法。时间没想象的焦虑&#xff0c;认真做一些事情算法入门篇 二、问题描述 从前&#xff0c;一群扇贝在海岸边悠哉游哉地生活着。它们衣食不…

亚马逊云科技宣布推出一个新的开源示例应用程序

5月5日&#xff0c;亚马逊云科技宣布推出一个新的开源示例应用程序&#xff0c;这是一个虚构的二手书电子商务商店&#xff0c;被称之为Bob’s Used Books&#xff0c;可供使用亚马逊云科技的.NET开发人员使用。“亚马逊云科技的.NET宣传和开发团队定期与客户交谈&#xff0c;在…

如何科学地利用高光谱图像合成真彩色RGB图像?

如何科学地利用高光谱图像合成真彩色RGB图像? 1. 前言 参考链接: 色匹配函数是什么&#xff1f; - 知乎 (zhihu.com) 23. 颜色知识1-人类的视觉系统与颜色 - 知乎 (zhihu.com) 色彩空间基础 - 知乎 (zhihu.com) 色彩空间表示与转换 - 知乎 (zhihu.com) CIE XYZ - fresh…

Golang笔记:使用melody包进行WebSocket通讯

文章目录 目的使用示例与说明总结 目的 WebSocket是Web开发应用中非常常用的功能&#xff0c;用于客户端和服务器间长时间的实时双向数据通讯。Golang中官方并没有实现这个功能&#xff0c;需要借助第三方的包来实现。 目前被最广泛使用的包是 gorilla/websocket https://pkg…

Host头攻击

转载与&#xff1a;https://blog.csdn.net/weixin_47723270/article/details/129472716 01 HOST头部攻击漏洞知识 Host首部字段是HTTP/1.1新增的&#xff0c;旨在告诉服务器&#xff0c;客户端请求的主机名和端口号&#xff0c;主要用来实现虚拟主机技术。 运用虚拟主机技术&a…

第八章:C语言的简单指针

谈起指针&#xff0c;简直就是谈虎色变&#xff0c;学习C语言的人都知道&#xff0c;指针的难度&#xff0c;就好像高中的导数一样&#xff0c;难道离谱&#xff0c;但是但是&#xff0c;别慌呀&#xff0c;咱们慢慢来&#xff0c;空杯心态&#xff0c;一步一个脚印&#xff0c…

【STM32】STM32使用继电器

STM32使用继电器 其实继电器简单来说就是一个开关&#xff0c;VCC表示电源正极、GND表示电源负极、IN表示信号输入脚&#xff0c;COM表示公共端&#xff0c;NC&#xff08;normal close&#xff09;表示常闭端&#xff0c;NO(normal open)表示常开端。一般情况下是常闭状态。 …

为数字人充值AI情商 小冰“克隆人”要卖给谁?

近日&#xff0c;小冰公司启动“GPT克隆人计划”&#xff0c;据悉最短只要采集三分钟数据&#xff0c;就能帮助用户创造源于本人性格、技能、声音、外貌的AI克隆人&#xff0c;如同拥有“平行世界的第二人生”。 这不免让人想起了《流浪地球2》里华仔为剧中女儿“数字续命”的…

chatgpt赋能Python-python3_2__1

Python3-2<<1&#xff1a; 了解运算符的使用和优先级 Python是一种优雅而高效的编程语言&#xff0c;而Python3-2<<1是一个关于运算符优先级的例子&#xff0c;值得我们深入探讨。 在这篇文章中&#xff0c;我们将介绍Python3中运算符的优先级&#xff0c;并对其中…

chatgpt赋能Python-python3_6怎么用

Python3.6是什么&#xff1f; Python是一种非常流行的编程语言&#xff0c;旨在提供简洁、易读且易于维护的代码。Python3.6是该语言的下一个主要版本&#xff0c;带来了一些改进并改进了现有功能&#xff0c; Python3.6有哪些新特性&#xff1f; 字典内置方法&#xff0c;支…

chatgpt赋能Python-python3_53怎么安装

Python3.5.3安装方法及注意事项 Python是一种高级编程语言&#xff0c;被广泛应用于科学&#xff0c;数学&#xff0c;机器学习等领域。在本文中&#xff0c;我们将介绍如何安装Python 3.5.3版本&#xff0c;并提供注意事项以确保安装过程顺利进行。 步骤1&#xff1a;下载Py…

生态碳汇涡度通量数据分析

生态碳汇涡度相关监测与通量数据分析 朱老师&#xff08;副教授&#xff09;&#xff1a;来自国内重点高校&#xff0c;长期从事涡度通量观测与分析研究&#xff0c;发表SCI论文多篇&#xff0c;主持国家与地方科研项目多个&#xff0c;在生态环境数据处理与分析中具有丰富的实…

java企业车辆管理系统myeclipse定制开发mysql数据库网页模式java编程jdbc

一、源码特点 java企业车辆管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 mysql数据库&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 java企业车辆管理系统myeclipse定制开发mysql 二、功能介绍 此次系统…

navicat连接mysql数据库密码忘记了快速找回

本机环境&#xff1a; mac 12.2.1 mysql8.0.3 问题&#xff1a; 连接navicat时&#xff0c;报错Access denied for user ‘root‘‘localhost‘ (using password: YES) 解决&#xff1a; 1.在navicat中导出xxx.ncx文件 勾选Export Password&#xff0c;选择要输出的文件目录…

nvidia-smi 参数详解

nvidia-smi 参数详解 参数详情GPU本机中的GPU编号&#xff0c;有多块显卡的时候从0开始&#xff0c;图中的GPU编号为0Fan风扇转速&#xff0c;N/A表示没有风扇NameGPU类型&#xff0c;图中GPU为NVIDIA GeForce GTX 1050TiTempGPU温度PerfGPU性能状态&#xff0c;从P0(最大性能)…

视频怎么转化为mp3,5种高效方法任选

视频怎么转化为mp3呢&#xff1f;想必这是我们工作过程中经常遇见的问题。众所周知&#xff0c;MP3格式是一种常见的音频格式&#xff0c;支持多种音频播放器和设备。通过将视频转换为MP3格式&#xff0c;用户可以方便地将视频的音频部分提取出来&#xff0c;保存为与视频大小不…

ChatGPT Plugin已正式上线 - 如何优先使用?

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

KDE Frameworks 5.106改进了Breeze图标、Plasma浏览器集成等功能

导读KDE项目今天发布了KDE Frameworks 5.106&#xff0c;作为KDE Frameworks 5的另一个月度更新&#xff0c;该集合有80多个Qt的附加库&#xff0c;为KDE Plasma桌面环境和KDE Gear软件套件提供通用功能。 主要的KDE Frameworks 6系列的工作仍在继续&#xff0c;但这并不意味着…