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>

相关文章
|
5月前
|
Web App开发 前端开发 JavaScript
Element UI框架中自定义input组件的placeholder样式。
确保这些样式在你的应用程序CSS文件中定义,且该文件已正确加载到项目中。通过以上方法,可以控制Element UI组件中input的placeholder样式,使其满足特定的设计要求。这些更改都是基于CSS伪元素进行的,因此并不会对DOM结构产生改变,保持了原有结构的简洁和高效。
483 12
|
5月前
|
存储 JavaScript 前端开发
element ui <el-date-picker> 设置展示当前月
在 Element UI 中,使用 `el-date-picker` 的 `value-format` 属性可将日期值格式化为指定字符串。设置 `type=&quot;month&quot;` 时,绑定值默认为 Date 对象,通过 `value-format=&quot;yyyy-MM&quot;` 可将其转为如 &quot;2023-05&quot; 格式,便于存储与处理。
1095 0
|
API UED 容器
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
1345 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
|
JavaScript
element-ui table表格多选后再打开默认选中
element-ui table表格多选后再打开默认选中
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
1013 0
|
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则提供了更深层的样式定制功能。开发者可根据项目需求及个人偏好选择合适的组件库。
1218 0
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
287 0
|
JavaScript 开发者 UED
Vue.js组件库大对决:Element UI与Vuetify,开发者的罗密欧与朱丽叶!
【8月更文挑战第30天】Element UI和Vuetify是Vue.js开发中的热门组件库,前者简洁高效,后者遵循Material Design,国际化程度高。两者均提供丰富的组件支持,但Vuetify组件更多样,设计更灵活;Element UI在性能和中文支持上更优。文档方面,Element UI更直观易懂,而Vuetify配置灵活但学习成本稍高。选择时需综合考虑项目需求、团队背景及设计风格,以达到最佳开发效果。
952 0
|
7月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
230 15
|
7月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
264 11

热门文章

最新文章