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


效果图


公共数据

Html

html 复制代码
<el-table :data="tableData" :span-method="changeSpanMethod" border
	style="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

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()

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

javascript 复制代码
// 排序方法
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;
}

固定合并行(写死)

javascript 复制代码
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
			};
		}
	}
}

动态合并行

javascript 复制代码
// 合并行数计算
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
	};
}

方法(函数)执行

javascript 复制代码
// 注:一下两个方法执行顺序不能颠倒
// 排序方法执行(如果不需要排序,那就不用执行排序方法)
this.groupByKeys(['name', 'amount3']);
// 计算合并行方法执行
this.calculateSpans();
相关推荐
dog shit17 分钟前
web第十次课后作业--Mybatis的增删改查
android·前端·mybatis
我有一只臭臭17 分钟前
el-tabs 切换时数据不更新的问题
前端·vue.js
七灵微21 分钟前
【前端】工具链一本通
前端
Nueuis1 小时前
微信小程序前端面经
前端·微信小程序·小程序
_r0bin_4 小时前
前端面试准备-7
开发语言·前端·javascript·fetch·跨域·class
IT瘾君4 小时前
JavaWeb:前端工程化-Vue
前端·javascript·vue.js
zhang98800004 小时前
JavaScript 核心原理深度解析-不停留于表面的VUE等的使用!
开发语言·javascript·vue.js
potender4 小时前
前端框架Vue
前端·vue.js·前端框架
站在风口的猪11084 小时前
《前端面试题:CSS预处理器(Sass、Less等)》
前端·css·html·less·css3·sass·html5
程序员的世界你不懂5 小时前
(9)-Fiddler抓包-Fiddler如何设置捕获Https会话
前端·https·fiddler