赞
踩
项目需求类似上图行合并其中有统计的小计和合计,后端返回数据并不是在同一个数组内,而是返回三个数组,基本数据数组、小计数组和合计数组。废话不多说,上代码
- <template>
- <div>
- <el-table ref="tableData" :data="tableData" style="width: 100%" :span-method="spanMethod" :header-cell-style="headerCellStyle" :cell-style="cellStyle" :row-class-name="tableRowClassName" @cell-click="tabClick">
- <el-table-column prop="name" label="游戏名称" align="center" width="40"></el-table-column>
- <el-table-column prop="type" label="游戏设备" align="center"></el-table-column>
- <el-table-column label="数据" align="center">
- <el-table-column prop="meterName" label="人物名称" align="center"></el-table-column>
- <el-table-column prop="totalNum" label="总场次" align="center"></el-table-column>
- <el-table-column prop="totalRate" label="总胜率" align="center"></el-table-column>
- </el-table-column>
- <el-table-column label="对战数据" align="center">
- <el-table-column prop="totalMeter" label="总计" align="center"></el-table-column>
- <el-table-column label="排位数据" align="center">
- <el-table-column prop="rankingCloseMeter" label="合计" align="center"></el-table-column>
- <el-table-column prop="rankingNum" label="排位场次" align="center">
- <template slot-scope="scope">
- <span v-if="scope.row.index === tabClickIndex && tabClickLabel === '排位场次'">
- <el-input v-model="scope.row.rankingNum" maxlength="300" placeholder="请输入排位场次" size="small" @blur="inputBlur"/>
- </span>
- <span v-else>{{ scope.row.rankingNum }}</span>
- </template>
- </el-table-column>
- <el-table-column prop="rankingRate" label="排位胜率" align="center" width="100">
- <template slot-scope="scope">
- <span v-if="scope.row.index === tabClickIndex && tabClickLabel === '排位胜率'">
- <el-input :rows="3" type="textarea" v-model="scope.row.rankingRate" maxlength="300" placeholder="请输入排位胜率" size="small" @blur="inputBlur"/>
- </span>
- <span v-else>{{ scope.row.rankingRate }}</span>
- </template>
- </el-table-column>
- <el-table-column prop="rankingAverage" label="排位平均经济" align="center">
- <template slot-scope="scope">
- <span v-if="scope.row.index === tabClickIndex && tabClickLabel === '排位平均经济'">
- <el-input v-model="scope.row.rankingAverage" maxlength="300" placeholder="请输入排位平均经济" size="small" @blur="inputBlur"/>
- </span>
- <span v-else>{{ scope.row.rankingAverage }}</span>
- </template>
- </el-table-column>
- </el-table-column>
- <el-table-column label="其他数据" align="center">
- <el-table-column prop="enterCloseMeter" label="合计" align="center"></el-table-column>
- <el-table-column label="深渊大乱斗" align="center">
- <el-table-column prop="Subtotal" label="小计" align="center"></el-table-column>
- <el-table-column prop="enterAbyssNum" label="深渊大乱斗场次" align="center">
- <template slot-scope="scope">
- <span v-if="scope.row.index === tabClickIndex && tabClickLabel === '深渊大乱斗场次'">
- <el-input v-model="scope.row.enterAbyssNum" maxlength="300" placeholder="请输入深渊大乱斗场次" size="small" @blur="inputBlur"/>
- </span>
- <span v-else>{{ scope.row.enterAbyssNum }}</span>
- </template>
- </el-table-column>
- <el-table-column prop="enterAbyssRate" label="深渊大乱斗胜率" align="center" show-overflow-tooltip>
- <template slot-scope="scope">
- <span v-if="scope.row.index === tabClickIndex && tabClickLabel === '深渊大乱斗胜率'">
- <el-input v-model="scope.row.enterAbyssRate" maxlength="300" placeholder="请输入深渊大乱斗胜率" size="small" @blur="inputBlur"/>
- </span>
- <span v-else>{{ scope.row.enterAbyssRate }}</span>
- </template>
- </el-table-column>
- <el-table-column prop="enterAbyssAverage" label="深渊大乱斗平均经济" align="center">
- <template slot-scope="scope">
- <span v-if="scope.row.index === tabClickIndex && tabClickLabel === '深渊大乱斗平均经济'">
- <el-input v-model="scope.row.enterAbyssAverage" maxlength="300" placeholder="请输入深渊大乱斗平均经济" size="small" @blur="inputBlur"/>
- </span>
- <span v-else>{{ scope.row.enterAbyssAverage }}</span>
- </template>
- </el-table-column>
- </el-table-column>
- <el-table-column label="日之塔" align="center">
- <el-table-column label="日之塔场次" prop="enterSunNum" align="center">
- <template slot-scope="scope">
- <span v-if="scope.row.index === tabClickIndex && tabClickLabel === '日之塔场次'">
- <el-input v-model="scope.row.enterSunNum" maxlength="300" placeholder="请输入日之塔场次" size="small" @blur="inputBlur"/>
- </span>
- <span v-else>{{ scope.row.enterSunNum }}</span>
- </template>
- </el-table-column>
- <el-table-column label="平均得分" prop="enterSunAverage" align="center">
- <template slot-scope="scope">
- <span v-if="scope.row.index === tabClickIndex && tabClickLabel === '平均得分'">
- <el-input v-model="scope.row.enterSunAverage" maxlength="300" placeholder="请输入平均得分" size="small" @blur="inputBlur"/>
- </span>
- <span v-else>{{ scope.row.enterSunAverage }}</span>
- </template>
- </el-table-column>
- </el-table-column>
- </el-table-column>
- <el-table-column label="在各位置发挥" align="center">
- <el-table-column label="中路" prop="middle" align="center" width="100"></el-table-column>
- <el-table-column label="对抗路" prop="upper" align="center" width="100"></el-table-column>
- <el-table-column label="发育路" prop="lower" align="center" width="100"></el-table-column>
- <el-table-column label="打野" prop="wild" align="center" width="100"></el-table-column>
- <el-table-column label="游走" prop="wander" align="center" width="100"></el-table-column>
- </el-table-column>
- </el-table-column>
- </el-table>
- </div>
- </template>
-
- <script>
- export default {
- data(){
- return{
- tableData:[],
- testArr1:[],
- testArr2:[],
- testArr3:[],
- testArr4:[],
- testArr5:[],
- testArr6:[],
- testPosition1:0,
- testPosition2:0,
- testPosition3:0,
- testPosition4:0,
- testPosition5:0,
- testPosition6:0,
- tabClickIndex:null,
- tabClickLabel:"",
- }
- },
- methods:{
- getTablist(){
- setTimeout(()=>{
- //表格数据
- let data=[
- {name:"王者荣耀",type:"手机",meterName:"貂蝉",totalNum:"80000",totalRate:"63",totalMeter:"50000",rankingCloseMeter:"30000",rankingNum:"30000",rankingRate:"76",rankingAverage:"15000",enterCloseMeter:"20000",Subtotal:"10000",enterAbyssNum:"5700",enterAbyssRate:"4300",enterAbyssAverage:"69",enterSunNum:"174000",enterSunAverage:"1700",middle:"优",upper:"良",lower:"良",wild:"优",wander:"优"},
- {name:"王者荣耀",type:"手机",meterName:"西施",totalNum:"80000",totalRate:"63",totalMeter:"50000",rankingCloseMeter:"30000",rankingNum:"30000",rankingRate:"76",rankingAverage:"15000",enterCloseMeter:"20000",Subtotal:"10000",enterAbyssNum:"5700",enterAbyssRate:"4300",enterAbyssAverage:"69",enterSunNum:"174000",enterSunAverage:"1700",middle:"优",upper:"良",lower:"良",wild:"一般",wander:"优"},
- {name:"王者荣耀",type:"手机",meterName:"王昭君",totalNum:"80000",totalRate:"63",totalMeter:"50000",rankingCloseMeter:"30000",rankingNum:"30000",rankingRate:"76",rankingAverage:"15000",enterCloseMeter:"20000",Subtotal:"10000",enterAbyssNum:"5700",enterAbyssRate:"4300",enterAbyssAverage:"69",enterSunNum:"174000",enterSunAverage:"1700",middle:"优",upper:"良",lower:"良",wild:"良",wander:"优"},
- {name:"王者荣耀",type:"电脑",meterName:"杨玉环",totalNum:"80000",totalRate:"63",totalMeter:"50000",rankingCloseMeter:"30000",rankingNum:"30000",rankingRate:"76",rankingAverage:"15000",enterCloseMeter:"20000",Subtotal:"10000",enterAbyssNum:"5700",enterAbyssRate:"4300",enterAbyssAverage:"69",enterSunNum:"174000",enterSunAverage:"1700",middle:"优",upper:"一般",lower:"良",wild:"一般",wander:"优"},
- {name:"王者荣耀",type:"电脑",meterName:"不知火舞",totalNum:"80000",totalRate:"63",totalMeter:"50000",rankingCloseMeter:"30000",rankingNum:"30000",rankingRate:"76",rankingAverage:"15000",enterCloseMeter:"20000",Subtotal:"10000",enterAbyssNum:"5700",enterAbyssRate:"4300",enterAbyssAverage:"69",enterSunNum:"174000",enterSunAverage:"1700",middle:"优",upper:"一般",lower:"良",wild:"优",wander:"优"},
- {name:"王者荣耀",type:"手表",meterName:"诸葛亮",totalNum:"80000",totalRate:"63",totalMeter:"50000",rankingCloseMeter:"30000",rankingNum:"30000",rankingRate:"76",rankingAverage:"15000",enterCloseMeter:"20000",Subtotal:"10000",enterAbyssNum:"5700",enterAbyssRate:"4300",enterAbyssAverage:"69",enterSunNum:"174000",enterSunAverage:"1700",middle:"优",upper:"差",lower:"良",wild:"优",wander:"优"}
- ]
- //小计数据
- let subtotal=[
- {name:"王者荣耀",type:"手机",meterName:"",totalNum:"240000",totalRate:"63",totalMeter:"150000",rankingCloseMeter:"90000",rankingNum:"90000",rankingRate:"76",rankingAverage:"45000",enterCloseMeter:"60000",Subtotal:"30000",enterAbyssNum:"26100",enterAbyssRate:"12900",enterAbyssAverage:"69",enterSunNum:"522000",enterSunAverage:"4100",middle:"优",upper:"良",lower:"良",wild:"",wander:""},
- {name:"王者荣耀",type:"电脑",meterName:"",totalNum:"160000",totalRate:"63",totalMeter:"10000",rankingCloseMeter:"60000",rankingNum:"60000",rankingRate:"76",rankingAverage:"30000",enterCloseMeter:"40000",Subtotal:"20000",enterAbyssNum:"11400",enterAbyssRate:"8600",enterAbyssAverage:"69",enterSunNum:"348000",enterSunAverage:"3400",middle:"优",upper:"一般",lower:"良",wild:"",wander:""},
- {name:"王者荣耀",type:"手表",meterName:"",totalNum:"80000",totalRate:"63",totalMeter:"50000",rankingCloseMeter:"30000",rankingNum:"30000",rankingRate:"76",rankingAverage:"15000",enterCloseMeter:"20000",Subtotal:"10000",enterAbyssNum:"5700",enterAbyssRate:"4300",enterAbyssAverage:"69",enterSunNum:"174000",enterSunAverage:"1700",middle:"优",upper:"差",lower:"良",wild:"",wander:""}
- ]
- //合计数据
- let total=[
- {name:"王者荣耀",type:"手表",meterName:"",totalNum:"480000",totalRate:"63",totalMeter:"300000",rankingCloseMeter:"180000",rankingNum:"180000",rankingRate:"76",rankingAverage:"90000",enterCloseMeter:"120000",Subtotal:"60000",enterAbyssNum:"34200",enterAbyssRate:"25800",enterAbyssAverage:"69",enterSunNum:"1044000",enterSunAverage:"10200",middle:"",upper:"",lower:"",wild:"",wander:""}
- ]
- //找到游戏设备不同的位置 并在此位置添加小计数据
- let subtotalArr=this.listOut(data,'type')
- subtotalArr.forEach((item,index)=>{
- subtotal[index].type="小计"
- data.splice(item+index,0,subtotal[index]);
- })
- //找到游戏名称不同的位置 并在此位置添加合计数据
- let totalArr=this.listOut(data,'name')
- totalArr.forEach((item,index)=>{
- total[index].name="合计"
- data.splice(item+index,0,total[index]);
- })
- //数据处理完成后把保存合并行数据下标的数组清空,如果下次展示此表格为刷新可以不清,但如果是同页面切换数据需要清空
- //对应此表格可能为切换为各个国家或各个地区
- this.testArr1=[]
- this.testArr2=[]
- this.testArr3=[]
- this.testArr4=[]
- this.testArr5=[]
- this.tableData=data
- this.rowspan(this.testArr1, this.testPosition1, "name");
- this.rowspan(this.testArr2, this.testPosition2, "type");
- this.rowspan(this.testArr3, this.testPosition3, "middle");
- this.rowspan(this.testArr4, this.testPosition4, "upper");
- this.rowspan(this.testArr5, this.testPosition5, "lower");
- this.rowspan(this.testArr6, this.testPosition6, "wander");
- },200)
- },
- //处理数据
- listOut(list,nm){
- let data=list
- let arr=[]
- data.forEach((item,index)=>{
- if(data.length==1){
- arr=[1]
- }else if(data.length==2){
- if(index==0){
- return false
- }else if(data[index][nm]!==data[index-1][nm]){
- arr=[1,2]
- }else if(data[index][nm]===data[index-1][nm]){
- arr=[2]
- }
- }else if(data.length>2){
- if(index==0){
- return false
- }else if(data[index][nm]!==data[index-1][nm]){
- if(index==data.length-1){
- arr.push(index)
- arr.push(data.length)
- }else{
- arr.push(index)
- }
- }else if(index==data.length-1){
- arr.push(data.length)
- }
- }
- })
- return arr
- },
- //获取合并列数组
- rowspan(spanArr, position, spanName) {
- this.tableData.forEach((item, index) => {
- if (index === 0) {
- spanArr.push(1);
- position = 0;
- } else {
- if ( this.tableData[index][spanName] === this.tableData[index - 1][spanName] ) {
- spanArr[position] += 1;
- spanArr.push(0);
- } else {
- spanArr.push(1);
- position = index;
- }
- }
- });
- },
- //合并单元格规则
- spanMethod({ row, column, rowIndex, columnIndex }){
- if(row.name =="合计"){
- if(column.label=="游戏名称"){
- return { rowspan:1,colspan:2 }
- }else if(columnIndex===1){
- return { rowspan:0,colspan:0 }
- }
- }
- if(columnIndex === 0){
- let _row=this.testArr1[rowIndex]
- let _col=_row>0?1:0
- return{rowspan: _row, colspan: _col}
- }
- if(columnIndex === 1){
- let _row=this.testArr2[rowIndex]
- let _col=_row>0?1:0
- return{rowspan: _row, colspan: _col}
- }
- if(columnIndex === 17){
- let _row=this.testArr3[rowIndex]
- let _col=_row>0?1:0
- return{rowspan: _row, colspan: _col}
- }
- if(columnIndex === 18){
- let _row=this.testArr4[rowIndex]
- let _col=_row>0?1:0
- return{rowspan: _row, colspan: _col}
- }
- if(columnIndex === 19){
- let _row=this.testArr5[rowIndex]
- let _col=_row>0?1:0
- return{rowspan: _row, colspan: _col}
- }
- if(columnIndex === 21){
- let _row=this.testArr6[rowIndex]
- let _col=_row>0?1:0
- return{rowspan: _row, colspan: _col}
- }
- },
-
-
-
- //表格颜色样式
- cellStyle({row, column, rowIndex, columnIndex}){
- if(row.name=="合计" || row.type=="小计"){
- return "color:red;"
- }
- if(column.label=="总计" || column.label=="合计" || column.label=="小计"){
- return "color:red;"
- }
- if(column.label=="排位场次" || column.label=="排位胜率" || column.label=="排位平均经济" || column.label=="深渊大乱斗场次" || column.label=="深渊大乱斗胜率" || column.label=="深渊大乱斗平均经济" || column.label=="日之塔场次" || column.label=="平均得分"){
- return "color:#409EFF;"
- }
- },
- //表头颜色样式
- headerCellStyle({row,column,rowIndex, columnIndex}){
- if(column.label=="总计" || column.label=="合计" ||column.label=="小计"){
- return "color:red;"
- }
- if(column.label=="排位场次" || column.label=="排位胜率" || column.label=="排位平均经济" || column.label=="深渊大乱斗场次" || column.label=="深渊大乱斗胜率" || column.label=="深渊大乱斗平均经济" || column.label=="日之塔场次" || column.label=="平均得分"){
- return "color:#409EFF;"
- }
- },
-
-
-
- tableRowClassName({ row, rowIndex }) {
- // 把每一行的索引放进row
- row.index = rowIndex
- },
- //添加可修改的列
- tabClick(row, column, cell, event) {
- if(row.type!="小计" && row.name!="合计"){
- switch (column.label) {
- case '排位场次': this.tabClickIndex = row.index; this.tabClickLabel = column.label; break;
- case '排位胜率': this.tabClickIndex = row.index; this.tabClickLabel = column.label; break;
- case '排位平均经济': this.tabClickIndex = row.index; this.tabClickLabel = column.label; break;
- case '深渊大乱斗场次': this.tabClickIndex = row.index; this.tabClickLabel = column.label; break;
- case '深渊大乱斗胜率': this.tabClickIndex = row.index; this.tabClickLabel = column.label; break;
- case '深渊大乱斗平均经济': this.tabClickIndex = row.index; this.tabClickLabel = column.label; break;
- case '日之塔场次': this.tabClickIndex = row.index; this.tabClickLabel = column.label; break;
- case '平均得分': this.tabClickIndex = row.index; this.tabClickLabel = column.label; break;
- default: return
- }
- }
- },
- // 失去焦点初始化 并修改
- inputBlur(row, event, column) {
- this.tabClickIndex = null
- this.tabClickLabel = ''
- },
- },
- created(){
- this.getTablist()
- }
- }
- </script>

其实并不建议使用代码中的方法,尽量让后端返回数据的时候只返回一个数组并排好序,毕竟前台处理数据比较慢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。