Element table根据字段合并表格(可多字段合并),附带拖拽列动态合并

news2024/11/15 15:37:09

效果如图,姓名 数值1 字段进行自动合并
上下内容如果相同,则进行合并
封装合并列js - tableMerge.js

// 获取列合并的行数
// params
// tableData: 表格数据
// mergeId: 合并的列的字段名
export const tagRowSpan = (tableData, mergeId) =>{
  const tagArr = [];
  let pos = 0;
  tableData.map((item, index) => {
    if (index === 0) {
      tagArr.push(1);
      pos = 0;
    } else if (tableData[index][mergeId] === tableData[index - 1][mergeId]) {
      // 合并项目
      tagArr[pos] += 1;
      tagArr.push(0);
    } else {
      tagArr.push(1);
      pos = index;
    }
  });
  return tagArr;
}
// 列方法
export const handleSpanMethod  = ({ rowIndex, columnIndex, column }, tagArr, needMergeCol) => {
  if (needMergeCol.includes(columnIndex)) {
    const _row = tagArr[column.property][rowIndex];
    const _col = _row > 0 ? 1 : 0;
    return {
      rowspan: _row,
      colspan: _col,
    };
  }
}

拖拽使用sortablejs

npm install sortablejs -S

使用实例

如果拖拽列 要动态生成列


<template>
  <el-table :data="tableData.data" border style="width: 100%; margin-top: 20px"
            :span-method="(param) => handleSpanMethod(param, tableData.spanMap, needMergeCol)" ref="dragTable" >
    <el-table-column :prop="col.prop" :label="col.label" v-for="(col, index) in colData" :key="col.prop + index">
    </el-table-column>

  </el-table>
</template>

<script>
import Sortable from 'sortablejs'
import { tagRowSpan ,handleSpanMethod} from '@/utils/tableMerge.js'
export default {
  data () {
    return {
      colData: [
        {
          prop: 'name',
          label: '姓名'
        },
        {
          prop: 'id',
          label: 'ID',
          width: '180'
        },
        {
          prop: 'amount1',
          label: '数值 1(元)'
        },
        {
          prop: 'amount2',
          label: '数值 2(元)'
        },
        {
          prop: 'amount3',
          label: '数值 3(元)'
        }
      ],
      tableData: {
        data: [{
          id: '1',
          name: '王小虎1',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '2',
          name: '王小虎1',
          amount1: '234',
          amount2: '4.43',
          amount3: 12
        }, {
          id: '3',
          name: '王小虎1',
          amount1: '324',
          amount2: '1.9',
          amount3: 9
        }, {
          id: '4',
          name: '王小虎4',
          amount1: '621',
          amount2: '2.2',
          amount3: 17
        }, {
          id: '5',
          name: '王小虎5',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }],
        mergeField: ['name','amount1'],
        //存储字段合并的行数
        spanMap: {},
      },
    };
  },
  methods: {
    handleSpanMethod,
    columnDrop () {
      const wrapperTr = document.querySelector('.el-table__header-wrapper tr')
      Sortable.create(wrapperTr, {
        animation: 180,
        delay: 0,
        onEnd: evt => {
          let value = this.colData
          const oldItem = value[evt.oldIndex]
          value.splice(evt.oldIndex, 1)
          value.splice(evt.newIndex, 0, oldItem)
        }
      })
    },
    init () {
      this.tableData.mergeField.forEach(item => {
        this.tableData.spanMap[item] = tagRowSpan(this.tableData.data, item);
      })
    }
  },
  computed: {
    needMergeCol () {
      return this.tableData.mergeField.map(item => {
        return this.colData.findIndex(col => col.prop === item)
      })
    }
  },
  mounted () {
    document.body.ondrop = function (event) {
      event.preventDefault(); //用于取消事件的默认行为,比如拒绝拖拽元素的默认行为;
      event.stopPropagation(); //用于阻止事件冒泡,避免出现多重事件响应
    }
    this.init()
    this.$nextTick(() => {
      this.columnDrop()
    })
  },
};
</script>


注意不支持行拖拽

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

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

相关文章

CentOS KVM虚拟安装和开机启动

1. 配置系统 关闭SELinux setenforce 0持久化关闭配置 vi /etc/selinux/config2. 安装虚拟化软件 安装 KVM、QEMU等虚拟化软件。 yum install qemu-kvm qemu-img virt-manager libvirt virt-install virt-viewer 检查LVM模块是否已经加载 lsmod |grep kvm设置开机启动 s…

【C语言】扫雷游戏(可展开)——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将运用数组来实现 扫雷游戏。 目录&#xff1a; &#x1f31f;思路框架测试游戏 &#x1f31f;测试部分函数实现&am…

SimSolid技术原理解析 衡祖仿真

面向超大规模结构的无网格分析软件Altair SimSolid&#xff0c;自从面世以来&#xff0c;受到广大工程师的关注。SimSolid 是面向设计师、工程师和分析师的颠覆性仿真技术&#xff0c;可在几分钟内对结构复杂的 CAD 装配体进行结构分析。它消除了传统结构仿真中非常耗时、非常专…

农业水价综合改革系统主要组成

一、系统概述 农业水价改革灌区信息化系统主要由感知采集层、网络传输层、系统应用层等部分组成。通过无线技术、感知层技术与新型应用的有效结合&#xff0c;可以用于各种业务的传送&#xff0c;充分满足灌区监测站间的物与物互联&#xff0c;农业生产的自动化和信息化相结合。…

计算机系统简介

计算机系统简介 计算机系统 硬件 计算机实体&#xff0c;如主机、外设软件 具有各类特殊功能的信息&#xff08;程序&#xff09;组成 软件 系统软件 用来管理整个计算机系统 &#xff08;语言处理程序、操作系统、服务性程序、数据库管理系统、网络软件&#xff09;应用…

Apple用户如何利用Twinmotion路径追踪器渲染

Twinmotion 是一款功能强大的实时可视化工具&#xff0c;允许设计人员为建筑设计、产品设计等创建高质量的渲染和交互体验。其当前最强大的渲染功能之一是路径追踪器&#xff0c;它通过精确的照明计算生成逼真的图像。 然而&#xff0c;许多 Apple 用户想知道如何利用 Twinmot…

生物医学翻译,选择专业翻译公司有何优势

我们知道&#xff0c;生物医学翻译是基于生物医学等相关行业的翻译服务&#xff0c;具有较强的专业性和复杂性&#xff0c;为了确保生物医学翻译的质量&#xff0c;务必选择专业的翻译公司。那么&#xff0c;专业翻译公司有何优势&#xff0c;北京生物医学翻译哪家好&#xff1…

【python】Leetcode(primer-set)

文章目录 78. 子集&#xff08;集合的所有子集&#xff09;90. 子集 II&#xff08;集合的所有子集&#xff09; 更多 leetcode 题解可参考&#xff1a;【Programming】 78. 子集&#xff08;集合的所有子集&#xff09; 给定一组不含重复元素的整数数组 nums&#xff0c;返回…

【python】Leetcode(primer-binary)

文章目录 504. 七进制数&#xff08;进制转换&#xff09;461. 汉明距离&#xff08;进制转换 / 异或&#xff09;136. 只出现一次的数字&#xff08;位运算&#xff09; 更多 leetcode 题解可参考&#xff1a;【Programming】 504. 七进制数&#xff08;进制转换&#xff09; …

Python学习 -- 类的继承

类继承是面向对象编程中的重要概念&#xff0c;它允许我们创建一个新的类&#xff0c;通过继承已有的类的属性和方法&#xff0c;从而实现代码的重用和扩展。Python作为一门面向对象的编程语言&#xff0c;提供了强大而灵活的类继承机制。本篇博客将深入探讨Python中类继承的概…

全国规模最大!算力并网行动开启

8月19日&#xff0c;在2023中国算力大会主论坛上&#xff0c;中国移动携手多个超算中心、智算中心&#xff0c;以及云服务商&#xff0c;共同发起全国规模最大的“百川”算力并网行动&#xff0c;打造算力类型最全、规模最大、覆盖最广的“百川”算力并网平台&#xff0c;加快推…

ngix详解

ngix是什么 Nginx是一款轻量级、高性能的Web服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。 正向代理&#xff1a; 客户端访问服务器时&#xff0c;统一通过一个代理服务器把请求…

Flutter实现动画列表AnimateListView

由于业务需要&#xff0c;在打开列表时&#xff0c;列表项需要一个从右边飞入的动画效果&#xff0c;故封装一个专门可以执行动画的列表组件&#xff0c;可以自定义自己的动画&#xff0c;内置有水平滑动&#xff0c;缩放等简单动画。花里胡哨的动画效果由你自己来定制吧。 功…

在本地搭建Jellyfin影音服务器,支持公网远程访问影音库的方法分享

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

爆火「视频版ControlNet」开源了!靠提示词精准换画风,全华人团队出品

“视频版ControlNet”来了&#xff01; 让蓝衣战神秒变迪士尼公举&#xff1a; 视频处理前后&#xff0c;除了画风以外&#xff0c;其他都不更改。 女孩说话的口型都保持一致。 正在插剑的姜文&#xff0c;也能“下一秒”变猩球崛起了。 这就是由全华人团队打造的最新视频处理…

四川玖璨电子商务有限公司:怎么拉升抖店体验分

抖音是中国最受欢迎的短视频分享平台之一&#xff0c;而在抖音上开设自己的抖店成为许多电商从业者的选择。为了提高抖店的曝光度和用户体验&#xff0c;抖店体验分成为了一个重要的指标。在本文中&#xff0c;小编将从两个方面来讨论怎么拉升抖店体验分&#xff0c;包括影响因…

你真的理解 shell 中的 $?

$? 是一个特殊变量&#xff0c;用于获取上一个命令或函数的退出状态码&#xff0c;这里要注意的是状态码和返回值是不同的概念。在函数中我们可以使用返回标志 return&#xff0c;return 的返回值会作为退出状态码供 $? 截取&#xff0c;当函数没有 return 返回值时&#xff…

【Jellyfin影音服务器】 本地部署公网远程影音库

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

程序员至少要掌握几种编程语言?来看看这些编程语言的优势和用途

你可能听说过&#xff0c;作为一个程序员&#xff0c;你要学习很多种编程语言&#xff0c;才能应对各种不同的项目和需求。那么&#xff0c;程序员最少要掌握几种编程语言呢&#xff1f;其实&#xff0c;这个问题没有一个确定的答案&#xff0c;因为不同的编程语言有不同的优势…

若依vue打印的简单方法

像我们后端程序员做前端的话,有时候真不需要知道什么原理,直接塞就好了 我们选用基于hiprint 的vue-plugin-hiprint来打印 目的是为了实现点击某些行的数据,然后点击某个按钮直接弹出下面的打印 此链接 大佬是原创,我拿来总结梳理一下 插件进阶功能请移步: 链接 插件模板制作页…