element UI table合并行合并列(整理)

简介: element UI table合并行合并列(整理)

图一
<template>
  <div class="container">
    <el-table :data="dataSource" :border="true"
      :header-cell-style="{ 'font-weight': 'normal', 'text-align': 'center' }"
      :cell-style="{ 'text-align': 'center' }" size="mini" style="width: 100%" :span-method="arraySpanMethod">
      <el-table-column type="index" label="序号" width="100"></el-table-column>
      <el-table-column prop="product_name" label="名称1"></el-table-column>
      <el-table-column prop="cap_name" label="名称2"></el-table-column>
      <el-table-column prop="name" label="名称3"></el-table-column>
      <el-table-column prop="name1" label="名称4"></el-table-column>
      <el-table-column prop="name2" label="名称5"></el-table-column>
    </el-table>
  </div>
</template>
<script>
  export default {
    name: "tableCom",
    data() {
      return {
        //注释:示例是用参数-product_name进行处理-该例好像只有数据是连续aaaa  或  bbbb才可以(第一条是a第二条是a第三条是b---不能第二条是b,第三条是a)
        dataSource: [{
            product_name: "aaaa",
            cap_name: "aa1",
            "name": 1,
            "name1": 1,
            "name2": 0
          },
          {
            product_name: "aaaa",
            cap_name: "aa2",
            "name": 0,
            "name1": 1,
            "name2": 1
          },
          {
            product_name: "bbbb",
            cap_name: "bb1",
            "name": 1,
            "name1": 1,
            "name2": 0
          },
          {
            product_name: "bbbb",
            cap_name: "bb2",
            "name": 0,
            "name1": 1,
            "name2": 1
          },
          {
            product_name: "bbbb",
            cap_name: "bb3",
            "name": 0,
            "name1": 1,
            "name2": 1
          },
          {
            product_name: "ccccc",
            cap_name: "cc2",
            "name": 0,
            "name1": 1,
            "name2": 1
          },
          {
            product_name: "ddddd",
            cap_name: "dd3",
            "name": 0,
            "name1": 1,
            "name2": 1
          },
        ],
      };
    },
    methods: {
      arraySpanMethod({
        row,
        column,
        rowIndex,
        columnIndex
      }) {
        // 合并行  产品名字相同合并
        if (columnIndex === 1) {
          if (rowIndex === 0 || row.product_name != this.dataSource[rowIndex - 1].product_name) {
            let rowspan = 0;
            this.dataSource.forEach(element => {
              if (element.product_name === row.product_name) {
                rowspan++;
              }
            });
            return [rowspan, 1];
          } else {
            return [0, 0];
          }
        }
        //合并列 名称值都为1 的合并
        if (columnIndex > 2) {
          let colspan = 0;
          let colkeys = Object.keys(row);
          let currentindex = columnIndex - 1;
          if (row[colkeys[currentindex]] === 1) {
            if (row[colkeys[currentindex - 1]] != row[colkeys[currentindex]]) {
              for (let i = currentindex; i < colkeys.length; i++) {
                if (row[colkeys[i]] === 1) {
                  colspan++;
                } else {
                  break;
                }
              }
              return [1, colspan];
            } else {
              return [0, 0];
            }
          }
        }
      }
    },
    created() {
    }
  };
</script>
图二、
<template>
  <div class="container">
    <el-table :data="tableData" border :span-method="objectSpanMethod">
      <el-table-column prop="name" label="测试1" align="center" />
      <el-table-column prop="name1" label="测试2" align="center" />
      <el-table-column prop="name2" label="测试3" align="center" />
    </el-table>
  </div>
</template>
<script>
  export default {
    name: "tableCom",
    data() {
      return {
        tableData: [{
            name: "测试1",
            name1: "111",
            name2: "1",
          },
          {
            name: "测试1",
            name1: "11111",
            name2: "1",
          },
          {
            name: "测试1",
            name1: "11111",
            name2: "1",
          },
          {
            name: "测试1",
            name1: "111111",
            name2: "1",
          },
          {
            name: "测试2",
            name1: "222",
            name2: "2",
          },
          {
            name: "测试2",
            name1: "2222",
            name2: "2",
          },
          {
            name: "测试3",
            name1: "333333",
            name2: "3",
          },
        ],
        rowIndex: "-1",
        OrderIndexArr: [],
        provinceArr: []
      };
    },
    methods: {
      merge() {
        let OrderObj = {};
        let provinceObj = {};
        this.tableData.forEach((element, index) => {
          element.rowIndex = index;
          if (OrderObj[element.name]) {
            let nextItem = this.tableData[index + 1] ?
              this.tableData[index + 1].name :
              undefined;
            let prevItem = this.tableData[index - 1].name ?
              this.tableData[index - 1].name :
              undefined;
            if (element.name == nextItem) {
              OrderObj[element.name].push(index);
            } else if (element.name == prevItem) {
              OrderObj[element.name].push(index);
            }
          } else {
            OrderObj[element.name] = [];
            OrderObj[element.name].push(index);
          }
          if (provinceObj[element.name1]) {
            let nextPro = this.tableData[index + 1] ?
              this.tableData[index + 1].name1 :
              undefined;
            let prevPro = this.tableData[index - 1].name1 ?
              this.tableData[index - 1].name1 :
              undefined;
            if (element.name1 == nextPro) {
              provinceObj[element.name1].push(index);
            } else if (element.name1 == prevPro) {
              provinceObj[element.name1].push(index);
            }
          } else {
            provinceObj[element.name1] = [];
            provinceObj[element.name1].push(index);
          }
        });
        // 将数组长度大于1的值 存储到this.OrderIndexArr(也就是需要合并的项)
        for (let k in OrderObj) {
          if (OrderObj[k].length > 1) {
            this.OrderIndexArr.push(OrderObj[k]);
          }
        }
        for (let i in provinceObj) {
          if (provinceObj[i].length > 1) {
            this.handleData(provinceObj[i])
          }
        }
      },
      handleData(data) {
        console.log(data, 'data');
        let temp = data;
        let itemArr = [];
        let itemArrNew = [];
        let resArr = [];
        if (data.length > 2) {
          for (let i = 0; i < data.length; i++) {
            if (data[i + 1]) {
              if (data[i + 1] - data[i] > 1) {
                itemArr = data.slice(0, i + 1)
                itemArrNew = temp.slice(i + 1, temp.length)
                break;
              } else {
                resArr = data
              }
            }
          }
          if (itemArr.length > 0 || itemArrNew.length > 0) {
            this.provinceArr.push(itemArr)
            this.provinceArr.push(itemArrNew)
          } else {
            this.provinceArr.push(data)
          }
        } else {
          this.provinceArr.push(data)
        }
      },
      objectSpanMethod({
        row,
        rowIndex,
        column,
        columnIndex
      }) {
        if (columnIndex === 0) {
          for (let i = 0; i < this.OrderIndexArr.length; i++) {
            let element = this.OrderIndexArr[i];
            for (let j = 0; j < element.length; j++) {
              let item = element[j];
              if (rowIndex === item) {
                if (j === 0) {
                  return {
                    rowspan: element.length,
                    colspan: 1
                  };
                } else if (j !== 0) {
                  return {
                    rowspan: 0,
                    colspan: 0
                  };
                }
              }
            }
          }
        }
        if (columnIndex === 1) {
          for (let j = 0; j < this.provinceArr.length; j++) {
            let element = this.provinceArr[j];
            for (let k = 0; k < element.length; k++) {
              let item = element[k];
              if (rowIndex === item) {
                if (k === 0) {
                  return {
                    rowspan: element.length,
                    colspan: 1
                  };
                } else if (k !== 0) {
                  return {
                    rowspan: 0,
                    colspan: 0
                  };
                }
              }
            }
          }
        }
      },
    },
    created() {
      this.$nextTick(() => {
        this.merge()
      })
    }
  };
</script>

相关文章
|
2月前
|
API UED 容器
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
287 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
|
2月前
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
165 0
|
3月前
|
JavaScript
element-ui table表格多选后再打开默认选中
element-ui table表格多选后再打开默认选中
|
4月前
|
JavaScript
基于Element UI或Element Plus实现具有倒计时的Message消息提示
本文介绍了如何在Element UI或Element Plus框架中实现具有倒计时功能的消息提示组件,支持多次点击生成多个独立倒计时的消息提示,并提供了详细的实现代码和使用示例。
383 1
基于Element UI或Element Plus实现具有倒计时的Message消息提示
|
4月前
|
JavaScript UED
基于Vue2.0仿Element UI的el-tooltip实现一个气泡框组件,支持多数据类型的显示和内容为空时不显示气泡框
该文章介绍了如何基于Vue2.0仿照Element UI的el-tooltip组件实现一个自定义的气泡框组件,该组件能够根据内容是否为空智能显示或隐藏,支持多种数据类型的显示。
133 0
基于Vue2.0仿Element UI的el-tooltip实现一个气泡框组件,支持多数据类型的显示和内容为空时不显示气泡框
|
4月前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
130 0
|
4月前
|
JavaScript 前端开发 开发者
决战前端之巅!Element UI与Vuetify谁才是Vue.js组件界的霸主?一场关于颜值与实力的较量!
【8月更文挑战第30天】本文对比了两款热门的Vue.js组件库——Element UI与Vuetify。Element UI由饿了么团队打造,提供多种高质量UI组件,设计简洁大方。Vuetify基于Material Design规范,支持Vue.js 2.0及3.0版本,具备前瞻性。两者均涵盖表单、导航、数据展示等组件,Element UI配置选项丰富,而Vuetify则提供了更深层的样式定制功能。开发者可根据项目需求及个人偏好选择合适的组件库。
348 0
|
4月前
|
JavaScript 开发者 UED
Vue.js组件库大对决:Element UI与Vuetify,开发者的罗密欧与朱丽叶!
【8月更文挑战第30天】Element UI和Vuetify是Vue.js开发中的热门组件库,前者简洁高效,后者遵循Material Design,国际化程度高。两者均提供丰富的组件支持,但Vuetify组件更多样,设计更灵活;Element UI在性能和中文支持上更优。文档方面,Element UI更直观易懂,而Vuetify配置灵活但学习成本稍高。选择时需综合考虑项目需求、团队背景及设计风格,以达到最佳开发效果。
224 0
|
1月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
2月前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。
134 3