废话不多说,间接上代码,因为代码比较简单,不多做解析
<template> <div class="sm"> <div class="sm-title"></div> <div class="sm-line"></div> <div style="display: flex; justify-content: center"> <div> <div style="display: flex" v-for="(item1, index1) in seatList" :key="index1"> <!-- v-if="JSON.stringify(item1) !== '{}'" --> <template> <div @click="seatClk(item)" class="sm-img" v-for="item in item1" :key="item.id"> <img v-if="item.status === 'N'" class="o-w o-h" src="https://hijinka.oss-cn-shanghai.aliyuncs.com/uploads/mall1/20220307/669dde5d9fe28a377c151cadecb8dd65.png" alt="" /> <img v-if="item.status === 'Y' && !item.isCheck" class="o-w o-h" src="https://hijinka.oss-cn-shanghai.aliyuncs.com/uploads/mall1/20220307/123044531581e70133020f0265bcabb2.png" alt="" /> <img v-if="item.status === 'Y' && item.isCheck" class="o-w o-h" src="https://hijinka.oss-cn-shanghai.aliyuncs.com/uploads/mall1/20220307/899c7f9e0365ce6d97f9d5fe89ffe878.png" alt="" /> </div> </template> </div> </div> </div> </div></template><script>export default { name: 'sysIndex', components: {}, data() { return { // 页面渲染的数据 seatList: [], // 后端返回的数据 arrList: [ { id: 1, seatNo: '1排1座', status: 'N', rowNo: '1', colNo: '1' }, { id: 2, seatNo: '1排2座', status: 'Y', rowNo: '1', colNo: '2' }, { id: 3, seatNo: '1排3座', status: 'Y', rowNo: '1', colNo: '3' }, { id: 4, seatNo: '1排4座', status: 'Y', rowNo: '1', colNo: '4' }, { id: 5, seatNo: '1排5座', status: 'Y', rowNo: '1', colNo: '5' }, { id: 6, seatNo: '2排2座', status: 'Y', rowNo: '2', colNo: '2' }, { id: 7, seatNo: '2排3座', status: 'Y', rowNo: '2', colNo: '3' }, { id: 8, seatNo: '2排4座', status: 'Y', rowNo: '2', colNo: '4' }, { id: 9, seatNo: '3排4座', status: 'Y', rowNo: '3', colNo: '4' } ] }; }, mounted() { // 找到行的最大值 const rowMax = this.findObjInArrMax(this.arrList, 'rowNo', true); // 找到列的最大值 const colMax = this.findObjInArrMax(this.arrList, 'colNo', true); const rowNoMax = parseInt(rowMax.rowNo) + 1; const colNoMax = parseInt(colMax.colNo) + 1; // 将一维数组装成二维数组 let list = []; for (var index = 0; index < rowNoMax; index++) { list[index] = []; for (var index1 = 0; index1 < colNoMax; index1++) { list[index][index1] = {}; } } // 后端返回的数据组合到二维数组外面 list.forEach((item1, index1) => { item1.forEach((item2, index2) => { this.arrList.forEach((item, index) => { item.isCheck = false; list[item.rowNo][item.colNo] = item; }); }); }); console.log('list', list); this.seatList = list; }, methods: { // 点击座位表 seatClk(item) { // 如果是能够抉择,而且没有选中状态 if (item.status === 'Y' && !item.isCheck) { item.isCheck = true; } else if (item.status === 'Y' && item.isCheck) { item.isCheck = false; } console.log(item); this.$forceUpdate(); }, // 找到数组对象中的最大值 findObjInArrMax(list, atr, returnVal) { let res = Math.max.apply( Math, list.map((item) => { return item[atr]; }) ); if (returnVal) { return list.filter((item) => { return item[atr] == res; })[0]; } else { return res; } }, // 找到数组对象中的最小值 findObjInArrMin(list, atr, returnVal) { let res = Math.min.apply( Math, list.map((item) => { return item[atr]; }) ); if (returnVal) { return list.filter((item) => { return item[atr] == res; })[0]; } else { return res; } } }};</script><style>.sm-img { width: 26px; height: 26px;}.sm { position: relative;}.sm-line { width: 0; height: 100vh; border: 1px dashed #ccc; position: absolute; top: 18px; left: 50%;}.sm-title { background-color: #dddddd; width: 190px; height: 17px; -webkit-transform: perspective(17px) rotateX(-10deg); transform: perspective(17px) rotateX(-10deg); margin: 0 auto; display: flex; align-items: center; justify-content: center; position: relative; z-index: 2;}</style>