当前位置: 首页 > news >正文

Web前端之Vue+Element实现表格动态不同列合并多行、localeCompare、forEach、table、push、sort、Map

MENU

  • 效果图
  • 公共数据
  • 数据未排序时(需要合并的行数据未处于相邻位置)
  • 固定合并行(写死)
  • 动态合并行
  • 方法(函数)执行


效果图

table


公共数据

Html

<el-table :data="tableData" :span-method="changeSpanMethod" borderstyle="width: 100%; margin-top: 20px"><el-table-column prop="department" label="科室" width="168px"></el-table-column><el-table-column prop="name" label="姓名"></el-table-column><el-table-column prop="amount1" label="特色套餐"></el-table-column><el-table-column prop="amount2" label="价格"></el-table-column><el-table-column prop="amount3" label="菜肴名称"></el-table-column><el-table-column prop="amount4" label="制作物料"></el-table-column>
</el-table>

JavaScript

// 数据
tableData: [{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '米饭',amount4: '水70g'},{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '油豆腐炒肉',amount4: '猪里脊20g'},{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '油豆腐炒肉',amount4: '油果50g'},{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '米饭',amount4: '香米50g'},{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '油豆腐炒肉',amount4: '葱花2g'},{department: '急诊大厅',name: '王五',amount1: '包子铺',amount2: '1.50',amount3: '水晶包',amount4: '肥肉10g'},{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '油豆腐炒肉',amount4: '蒜米5g'},{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '油豆腐炒肉',amount4: '豆油2g'}, {department: '急诊大厅',name: '王五',amount1: '包子铺',amount2: '1.50',amount3: '水晶包',amount4: '糖10g'},{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '油豆腐炒肉',amount4: '盐2g'},{department: '急诊大厅',name: '张三',amount1: '桂林米粉套餐',amount2: '5.50',amount3: '油豆腐炒肉',amount4: '酱油3g'},{department: '急诊大厅',name: '李四',amount1: '早餐1',amount2: '6.00',amount3: '小米粥',amount4: '香米20g'},{department: '急诊大厅',name: '李四',amount1: '早餐1',amount2: '6.00',amount3: '煎蛋',amount4: '鸡蛋50g'},{department: '急诊大厅',name: '王五',amount1: '包子铺',amount2: '1.50',amount3: '水晶包',amount4: '面粉50g'},{department: '急诊大厅',name: '李四',amount1: '早餐1',amount2: '6.00',amount3: '小米粥',amount4: '水70g'},{department: '急诊大厅',name: '李四',amount1: '早餐1',amount2: '6.00',amount3: '煎蛋',amount4: '油20g'},{department: '急诊大厅',name: '李四',amount1: '早餐1',amount2: '6.00',amount3: '榨菜',amount4: '榨菜20g'}
],
spanConfig: ['department', 'name', 'amount1', 'amount2', 'amount3'],
spanMap: new Map()

数据未排序时(需要合并的行数据未处于相邻位置)

// 排序方法
groupByKeys(keyLis) {let list = this.tableData;let res = list.sort((a, b) => {// localeCompare汉字排序const sor1 = b[keyLis[0]].localeCompare(a[keyLis[0]], 'zh');if (sor1 !== 0) return sor1;return a[keyLis[1]].localeCompare(b[keyLis[1]], 'zh');});this.tableData = res;
}

固定合并行(写死)

changeSpanMethod({row,column,rowIndex,columnIndex
}) {if (columnIndex === 0) {if (rowIndex === 0) {return {rowspan: 11,colspan: 1};} else {return {rowspan: 0,colspan: 0};}}if (columnIndex === 1) {if (rowIndex === 0) {return {rowspan: 8,colspan: 1};} else if (rowIndex === 8) {return {rowspan: 3,colspan: 1};} else {return {rowspan: 0,colspan: 0};}}if (columnIndex === 2) {if (rowIndex === 0) {return {rowspan: 8,colspan: 1};} else if (rowIndex === 8) {return {rowspan: 3,colspan: 1};} else {return {rowspan: 0,colspan: 0};}}if (columnIndex === 3) {if (rowIndex === 0) {return {rowspan: 8,colspan: 1};} else if (rowIndex === 8) {return {rowspan: 3,colspan: 1};} else {return {rowspan: 0,colspan: 0};}}if (columnIndex === 4) {if (rowIndex === 0) {return {rowspan: 1,colspan: 1};} else if (rowIndex === 1) {return {rowspan: 7,colspan: 1};} else if (rowIndex >= 2 && rowIndex <= 7) {return {rowspan: 0,colspan: 0};} else {return {rowspan: 1,colspan: 1};}}
}

动态合并行

// 合并行数计算
calculateSpans() {const spanConfig = this.spanConfig;const tempMap = new Map();spanConfig.forEach(prop => {const spans = [];let position = 0;this.tableData.forEach((item, index) => {if (index === 0) {spans.push(1);position = 0;} else {// 当前行内容与上一行相同if (this.tableData[index][prop] === this.tableData[index - 1][prop]) {spans[position] += 1;spans.push(0);} else {spans.push(1);position = index;}}});tempMap.set(prop, spans);});this.spanMap = tempMap;
},
// 合并方法
changeSpanMethod({column,rowIndex
}) {const spanConfig = this.spanConfig;const config = spanConfig.find(item => item === column.property);if (!config) return {rowspan: 1,colspan: 1};const spans = this.spanMap.get(config);if (!spans) return {rowspan: 1,colspan: 1};return {rowspan: spans[rowIndex],colspan: spans[rowIndex] > 0 ? 1 : 0};
}

方法(函数)执行

// 注:一下两个方法执行顺序不能颠倒
// 排序方法执行(如果不需要排序,那就不用执行排序方法)
this.groupByKeys(['name', 'amount3']);
// 计算合并行方法执行
this.calculateSpans();

http://www.mrgr.cn/news/97949.html

相关文章:

  • C#容器源码分析 --- List
  • vue2添加背景水印-手动实现(无组件模式)
  • Python 实现的运筹优化系统数学建模详解(最大最小化模型)
  • Vue3+Vite+TypeScript+Element Plus开发-11.Pinia持久化处理
  • 【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统获取图书列表接口(后端:计算图书页数、查询当前页展示的书籍)
  • 【特权FPGA】之AT24C02 IIC实现
  • 18. git pull
  • 深度学习基础--CNN经典网络之分组卷积与ResNext网络实验探究(pytorch复现)
  • OpenGL学习笔记(模型材质、光照贴图)
  • UniApp 实现兼容 H5 和小程序的拖拽排序组件
  • 15. git remote
  • 14. git clone
  • 【特权FPGA】之按键消抖
  • 蓝桥杯备赛知识点总结
  • YOLOv8主干网络升级——融合ResNet18/34/50/101的高效特征提取架构设计
  • 天梯集训笔记整理
  • 剑指offer经典题目(三)
  • Java—HTML:3D形变
  • 简化DB操作:Golang 通用仓库模式
  • 【正点原子】一键锁定IP:STM32MP135 开机就上网!