element 复杂表格渲染(2)

16 篇文章 0 订阅
9 篇文章 0 订阅
关于 element table 合计
组件
<div class="table_warp">
     <el-row >
        <el-table ref="table" :data="tableData" border :summary-method="getSummaries" show-summary :cell-style="cellStyle" :header-cell-style="headCellStyle">
            <el-table-column prop="month" width="130px" align="center" fixed="left">
                 <template slot-scope="{row}">
                      <span>{{row|monthFilter}}</span>
                 </template>
             </el-table-column>
             <el-table-column v-for="(ite,ind) in tableHead" minWidth="130px" :key="ind+ite+Date.now().toString()" align="center">
                 <template slot="header" >
                       <span>{{ite}}</span>
                 </template>
                 <template slot-scope="{row}">
                      <p :ref="`span${i}`" style="padding: 0;margin:4px 0;cursor: pointer;" v-for="(v,i) in row.tourData[ind]" @click="click(v)" :key="i+Date.now().toString()" :class="getClass(v.status)" @mousedown="v.status==='未巡视'?rightClick(v):''">{{v.personName?v.personName:''}}</p>
                 </template>
             </el-table-column>
       </el-table>
                    
       <div v-if="!this.tableHead.length" class="no-data">
            <span>暂无数据</span>
       </div>
	</el-row>
	<div class="tips">
	<span>注: 
		<span class="orage"><i class="tip" style="background-color:#f7ab00"></i>未巡视</span>
		<span class="blue"><i class="tip" style="background-color:#00a2e9"></i>已巡视</span>
		<span class="greed"><i class="tip" style="background-color:#7fbe26"></i>已落实</span>
	</span>
	</div>
</div>
逻辑

<script>
    export default {
        data(){
            return{
                tableData:[],//test
                tableHead:[],
            }
        },
        mounted(){
            this.$nextTick(()=>{
                this.getTable()//初始化
            })
        },
        filters:{
            monthFilter(val){
                let showVal = ''
                switch(val.month){
                    case '1月' : showVal ='一月';
                    break;
                    case '2月' : showVal ='二月';
                    break;
                    case '3月' : showVal ='三月';
                    break;
                    case '4月' : showVal ='四月';
                    break;
                    case '5月' : showVal ='五月';
                    break;
                    case '6月' : showVal ='六月';
                    break;
                    case '7月' : showVal ='七月';
                    break;
                    case '8月' : showVal ='八月';
                    break;
                    case '9月' : showVal ='九月';
                    break;
                    case '10月' : showVal ='十月';
                    break;
                    case '11月' : showVal ='十一月';
                    break;
                    case '12月' : showVal ='十二月';
                    break;
                }
                return showVal
            }
        },
        methods:{
            getClass(v){
                let sty = ''
                switch(v){
                    case '已落实' : sty = 'greed';
                    break;
                    case '已巡视' : sty = 'blue';
                    break;
                    case '未巡视' : sty = 'orage';
                    break;
                }
                return sty+' span_item'
            },
            cellStyle({row,column,rowIndex,columnIndex}){
                if(columnIndex===0)return 'background-color: #fafafa;height:50px'
            },
            headCellStyle({row,rowIndex}){
                if(rowIndex===0)return 'height:50px'
            },
            //init data
            init(arr,size){
                size = parseInt(size)
                if(isNaN(size)||size<1||size>=arr.length)return [arr]
                let newArr = []
                for(let i=0;i< arr.length;i+=size){
                    newArr.push(arr.slice(i,i+size))
                }
                return newArr
            },
            //flat array
            flatArray(arr){
                let res = []
                function flat(arr){
                    for(let i=0;i<arr.length;i++){
                        Array.isArray(arr[i])?flat(arr[i]):res.push(arr[[i]])
                    }
                }
                flat(arr)
                return res
            },
            //合计功能
            getSummaries({columns,data}){
                // console.log('params............',columns,data)
                const list = []
                let tourData = data.map(item=>{return item.tourData})
                let arrlist = []
                this.tableHead.forEach((ite,index)=>{
                    tourData.forEach(item=>{
                        return arrlist.push(item[index])
                    })
                })
                let dataList = this.init(arrlist,12)
                let l = dataList.map(item=>{
                    return item.map(ite=>{
                        return ite.filter(v=>{
                            return v.personName
                        })
                    })
                })
                let li = l.map(item=>{
                    return item.filter(ite=>{
                        return ite.length!==0
                    })
                })
                
                let dataLiss = []
                li.forEach((item,i)=>{
                    dataLiss[i] = this.flatArray(item)
                })
                columns.forEach((item,index) => {
                    // console.log('cloumn',item)
                    if(index===0){
                        list[index] = '总计巡视次数'
                        return
                    }
                    if(index>0&&li[index-1].length>0)list[index] = dataLiss[index-1].length
                    else list[index] = 0
                });
                return list
            },
            async click(row){
            	//点击单元格
                console.log('detail。。。。。。。',row)
            },
            async getTable(){
            	//获取数据
                if(this.selectDate===''||null||undefined) return
                this.isShow = false
                this.$nextTick(()=>this.isShow=true)
                this.tableData = []
                this.tableHead = []
                const res = await get(api.xxx,{params:{}})
                // console.log('ccccc',res)
                if(res.code==='0'){
                    this.tableData = res.data.tableData
                    res.data.tableHead.splice(0,1)
                    this.tableHead = res.data.tableHead
                }else this.$message.console.error(res.msg)
            },
        },
    }
</script>
样式
<style scoped lang='less'>
.sta_warp{
    padding: 10px;
    .header_box{
        display: flex;
        justify-content: space-between;
        border-left: 4px solid;
        background-color: #fff;
        align-items: center;
        padding-right: 20px;
        margin-right: 10px;

        .pic_tit{
            height: 40px;
            display: flex;
            align-items: center;
            font{
                font-size: 16px;
                font-weight: bold;
                margin: 0 16px;
            }
            /deep/ .el-input--prefix .el-input__inner{
                height: 30px;
                line-height: 30px;
            }
        }
    }
    .table_warp{
        margin-right: 10px;
        margin-top: 14px;
        
        /deep/ .el-row {
            .el-table{
                overflow: auto;
                // min-height: 730px;
                .el-table__body-wrapper,.el-table__footer-wrapper, .el-table__header-wrapper{
                    overflow: visible;
                }
                .el-table__footer-wrapper{
                    .el-table__footer{
                        height: 45px;
                    }
                }
            }
            .el-table td, .el-table th{
                padding: 4px 0;
            } 
        }
        /deep/ .el-table__fixed-footer-wrapper tbody td{
            height: 45px;
        }
        .tips{
            margin: 0 auto;
            span{
                display: flex;
                justify-content: center;
                align-items: center;
                .tip{
                    display: block;
                    width: 10px;
                    height: 10px;
                    margin: 20px;
                }
            }
        }
    }
}
.span_box{
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
    .span_item{
        width: 130px;
        cursor: pointer;
        margin: 0 4px;
    }

}
.greed{
    color:#7fbe26;
}
.blue{
    color:#00a2e9;
}
.orage{
    color:#f7ab00;
}
.no-data{
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    text-align: center;
    line-height: 50vh;
}
</style>
效果预览

无数据状态
在这里插入图片描述
有数据
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值