废话不多说,先看成果如下,我固定的是前三列,简单表头渲染,是我前一章节说的(https://segmentfault.com/a/11...)
1、elementui的table的多级表头固定前n列(留神:n列是依据width来固定的)的问题所在
1.1 发现给了el-column固定宽度,和fixed属性后,其余没有这两个属性的el-column局部被加上了is-hidden的类名(这个要浏览器控制台查看html构造代码才晓得),导致页面渲染的数据被暗藏了,所以要想方法去掉这个类名1.2 通过查看html构造后,应用jquery去掉is-hidden类名(没有想到更好的方法,有其余方法的大神心愿能点拔我一下)
2、解决的方法:
2.1 外围代码:
this.$nextTick(() => { // 如果不是固定列用这个 let myTrList = $('.kingChangeHead .el-table__header .has-gutter tr'); // 第一行表头(表头的款式) let colorTr = myTrList.eq(0); let colorTh = colorTr.find('th').eq(0); $(colorTh).removeClass('is-hidden'); $(colorTh) .find('.cell') .css({ color: '#000', 'font-size': '18px', 'font-weight': 'bold' }); /** * @Date: 2021-08-17 * @author @拿菜刀砍电线 * @Description:为了解决elementui的简单表头,固定前三列的问题 * 问题剖析1、发现给了固定宽度,和fixed属性后,没有固定的局部被加上了is-hidden的类名,导致页面数据被暗藏了,所以要想方法去掉这个类名 * 2、通过查看html构造后,应用jquery去掉is-hidden类名 */ let kingBody = $('.kingChangeHead .el-table__body-wrapper .el-table__body tr'); kingBody.each(function(index, domEle) { $(domEle) .find('td') .each(function(index1, domEle1) { $(domEle1).removeClass('is-hidden'); }); }); if (this.$refs.mutipleTable !== undefined) { this.$refs.mutipleTable.doLayout(); } });
2.2 全副代码:
<template> <div class="barCodeManageIndex"> <div> <div class="collapseContent"> <div id="searchForm" class="collapseCon"> <el-form label-position="right"> <div class="l-f"> <el-form-item label="年份:" label-width="50px"> <el-date-picker :clearable="false" format="yyyy" value-format="yyyy" v-model="searchForm.year" type="year" placeholder="请抉择"></el-date-picker> </el-form-item> <el-form-item label="月份:" label-width="50px"> <el-select :clearable="false" v-model.trim="searchForm.month" placeholder="请抉择"> <el-option v-for="(item, index) in monthList" :key="index" :label="item.label" :value="item.value"></el-option> </el-select> </el-form-item> </div> </el-form> </div> </div> </div> <div class="collapseContent"> <div @click.self="show = !show" class="l-f l-flex-c collapseCon pointer"> <i @click.self="show = !show" class="el-icon-arrow-up o-mr-40" :class="{ isRotate: !show }"></i> <el-button class="o-ml-12" icon="el-icon-zoom-in" v-preventReClick type="goon" size="mini" @click="searchAll">查问</el-button> <el-button class="o-ml-12" icon="el-icon-my-export" v-preventReClick type="success" size="mini" @click="exportFile">导出</el-button> <el-button class="o-ml-12 kingButton" icon="el-icon-full-screen" v-preventReClick type="success" size="mini" @click="clickFullscreen('kingFullScreen')"> 全屏显示 </el-button> </div> <div> <el-collapse-transition> <div v-show="show"> <div class="showToolTip changeElBoCoSt kingChangeHead"> <el-table id="kingFullScreen" v-loading="loading" :cell-style="sca_CellStyle" border highlight-current-row :height="clientHeight" resizable :data="tableData" ref="mutipleTable" :span-method="objectSpanMethod" :header-cell-style="headerCellStyleNameKing" :row-style="selectedHighlight_custom" > <el-table-column fixed width="300" :label="subCompanyMonth + '月-五大战区各项品质汇总'" align="center"> <el-table-column fixed :index="kingIndex" type="index" label="序号" width="60" align="center"></el-table-column> <el-table-column fixed prop="type" label="类型" width="120" align="center"> <template slot-scope="scope"> <span v-if="scope.$index == 0" style="font-weight: bold;"> 各区排名 <span style="color: blue;">第一</span> 我的项目个数 </span> <span v-else-if="scope.$index == 1" style="font-weight: bold;"> 各区排名 <span style="color: red;">最初</span> 我的项目个数 </span> <span v-else>{{ scope.row.type }}</span> </template> </el-table-column> <el-table-column fixed prop="project" label="我的项目" width="120" align="center"></el-table-column> <el-table-column v-if="tableData && tableData.length > 0" v-for="(value1, key, index) in tableDataDetail" :key="index + 'day'" :label="key" align="center" > <el-table-column v-for="(value2, key2, index2) in value1" :key="index2" :label="key2" align="center"> <el-table-column v-for="(item1, index1) in value2" :key="index1" :label="item1.name" align="center"> <template slot-scope="scope"> <span :style="{ color: scope.row.daySale[key][key2][index1]['color'], fontWeight: scope.row.daySale[key][key2][index1]['fontBold'] }" > {{ scope.row.daySale[key][key2][index1]['value'] }} </span> </template> </el-table-column> </el-table-column> </el-table-column> </el-table-column> </el-table> </div> </div> </el-collapse-transition> </div> </div> </div></template><script>export default { name: 'brCoInAn_daRe_ovSuOfThZone', data() { return { // 代表的月份 subCompanyMonth: '', formLabelWidth: '120px', searchFormLableWidth: '100px', // 查问参数 searchForm: { month: '', year: null }, show: true, tableData: [], // 表格高度 clientHeight: null, // 统计合并多少行 needMergeArr: ['type'], // 有合并项的列 rowMergeArrs: {} // 蕴含须要一个或多个合并项信息的对象 }; }, computed: { monthList() { let monthList = []; for (var i = 1; i < 13; i++) { monthList.push({ label: `${i}月`, value: i }); } return monthList; }, loading() { return this.GetStore('globalNotice', 'kingLoading'); }, tableDataDetail() { let tableData = []; if (this.tableData && this.tableData.length > 0) { tableData = this.tableData[0]['daySale']; } return tableData; } }, mounted() { this.searchForm.year = this.GetCurrentTime().orderYear; this.searchForm.month = Number(this.GetCurrentTime().yearMonth.substring(5, 7)); // 自定义table的宽度,为了固定表头 this.clientHeight = document.body.clientHeight - 230; const that = this; window.onresize = () => { return (() => { window.clientHeight = document.body.clientHeight; that.clientHeight = window.clientHeight - 230; })(); }; }, updated() { this.$nextTick(() => { if (this.$refs.mutipleTable !== undefined) { this.$refs.mutipleTable.doLayout(); } }); }, methods: { // 第一第二行背景色 selectedHighlight_custom({ row, rowIndex }) { // if (rowIndex == 0 || rowIndex == 1) { // return { // 'background-color': '#ddd' // }; // } }, // 点击导出按钮 exportFile() { this.exportFile_king(this.$api.reBrGuAnalyAreaexportReport, this.searchForm); }, /** * @description 实现合并行或列 * @param row:Object 须要合并的列name 如:'name' 'id' * @param column:Object 以后行的行数,由合并函数传入 * @param rowIndex:Number 当前列的数据,由合并函数传入 * @param columnIndex:Number 当前列的数据,由合并函数传入 * * @return 函数能够返回一个蕴含两个元素的数组,第一个元素代表rowspan, * 第二个元素代表colspan。 也能够返回一个键名为rowspan和colspan的对象 */ objectSpanMethod({ row, column, rowIndex, columnIndex }) { // 第一行的达成,环比,排名,列合并 if (rowIndex === 0 || rowIndex === 1) { if (column.label == '达成') { return [1, 3]; } else if (column.label == '环比') { return [0, 0]; } else if (column.label == '排名') { return [0, 0]; } } // 第一,第二行的1,2,3列合并 if (rowIndex === 0 || rowIndex === 1) { if (columnIndex === 0) { return [0, 0]; } else if (columnIndex === 1) { return [1, 3]; } else if (columnIndex === 2) { return [0, 0]; } } // 办法二:(合并行) for (let key in this.rowMergeArrs) { if (column.property == key) { let _row = this.rowMergeArrs[key].rowArr[rowIndex]; let _col = _row > 0 ? 1 : 0; return [_row, _col]; } } }, // 用来合并表头的(label为“整体”的高低两行合并) headerCellStyleNameKing({ row, column, rowIndex, columnIndex }) { if (rowIndex === 0) { this.$nextTick(() => { if ($('.' + column.id).length !== 0) { $('.' + column.id + ' .cell').css({ color: '#111', 'font-weight': 'bold' }); } }); return column; } else if (rowIndex === 2) { if (column.label == '整体') { this.$nextTick(() => { if ($('.' + column.id).length !== 0) { $('.' + column.id + ' .cell').css({ color: '#111', 'font-weight': 'bold', 'font-size': '20px' }); $('.' + column.id).attr('rowspan', 2); // var _c = document.getElementsByClassName(column.id); // document.getElementsByClassName(column.id)[0].setAttribute('rowSpan', 2); } }); return column; } else { return { textAlign: 'center', color: '#111111', fontSize: '16px', fontWeight: 400 }; } } else if (rowIndex === 3) { if (column.label == '整体') { return { display: 'none' }; } else { return { textAlign: 'center', color: '#111111', fontSize: '16px', fontWeight: 400 }; } } else { return { textAlign: 'center', color: '#111111', fontSize: '16px', fontWeight: 400 }; } }, // 解决下标从第二行开始,(数字要从1开始) kingIndex(index) { if (index != 0 || index != 1) { return index - 1; } }, searchAll() { this.tableData = []; this.getList(); }, getList() { // 因为工夫是肯定要的,如果用户没有抉择工夫,要强制 if (!this.searchForm.year) { this.searchForm.year = this.GetCurrentTime().orderYear; } if (!this.searchForm.month) { this.searchForm.month = Number(this.GetCurrentTime().yearMonth.substring(5, 7)); } // 表头数据 this.subCompanyMonth = this.searchForm.month || ''; this.$store.commit('Edit_loading', true); let param = this.searchForm; this.$method(this.$api.reBrGuAnalygetAreaSumReport, 'post', param).then(res => { if (res.data && res.data.length > 0) { res.data.forEach((item, index) => { for (let key in item.daySale) { for (let key1 in item.daySale[key]) { item.daySale[key][key1].forEach((item1, index1) => { // 色彩和加粗 item1.color = null; item1.fontBold = null; // 如果有值 if (item1.value != null) { // 有没有变色 if (item1.isRanking == 1) { item1.color = 'blue'; item1.fontBold = 'bold'; } else if (item1.isRanking == 2) { item1.color = 'red'; item1.fontBold = 'bold'; } // 看是不是整数类型 // 2代表为整数 if (item1.algorithm != 2 && item1.algorithm != 4 && item1.algorithm != null) { item1.value = this.Big(item1.value).mul(100) + '%'; } } else { item1.value = '-'; } }); } } }); } this.tableData = res.data; // 解决数据 this.rowMergeArrs = this.rowMergeHandle(this.needMergeArr, this.tableData); this.$nextTick(() => { // 如果不是固定列用这个 let myTrList = $('.kingChangeHead .el-table__header .has-gutter tr'); // 第一行表头(表头的款式) let colorTr = myTrList.eq(0); let colorTh = colorTr.find('th').eq(0); $(colorTh).removeClass('is-hidden'); $(colorTh) .find('.cell') .css({ color: '#000', 'font-size': '18px', 'font-weight': 'bold' }); /** * @Date: 2021-08-17 * @author @拿菜刀砍电线 * @Description:为了解决elementui的简单表头,固定前三列的问题 * 问题剖析1、发现给了固定宽度,和fixed属性后,没有固定的局部被加上了is-hidden的类名,导致页面数据被暗藏了,所以要想方法去掉这个类名 * 2、通过查看html构造后,应用jquery去掉is-hidden类名 */ let kingBody = $('.kingChangeHead .el-table__body-wrapper .el-table__body tr'); kingBody.each(function(index, domEle) { $(domEle) .find('td') .each(function(index1, domEle1) { $(domEle1).removeClass('is-hidden'); }); }); if (this.$refs.mutipleTable !== undefined) { this.$refs.mutipleTable.doLayout(); } }); }); } }};</script><style lang="scss">.changeElBoCoSt { .el-table .cell { color: #333; } .el-table__header { // border-right: 1px solid #000; border-top: 1px solid #000; border-left: 1px solid #000; } .el-table__body { // border-right: 1px solid #000; // border-bottom: 1px solid #000; border-left: 1px dashed #000; } .el-table--border td { border-right: 1px dashed #000; } .el-table--border th { border-right: 1px solid #000; } .el-table__body-wrapper .el-table--border.is-scrolling-left ~ .el-table__fixed { border-right: 1px dashed #000; } .el-table--border th { border-bottom: 1px solid #000; } .el-table__fixed-right-patch { border-bottom: 1px dashed #000; } .el-table td { border-bottom: 1px dashed #000; } .el-table th.is-leaf { border-bottom: 1px solid #000; } .el-table__header tr, .el-table__header th { background-color: #ffc000 !important; } // // body的每一行的最初一个单元格 // .el-table__body tr td:last-child { // border-right: 1px solid #000; // } // // body的最初一行 // .el-table__body tr:last-child td { // border-bottom: 1px solid #000; // } // //(刚好最初两行的第一列有合并才要这个) // .el-table__body tr:first-child td:first-child { // border-bottom: 1px solid #000; // } // 双下划线(表体) // .kingRowIndex td { // border-bottom: 2px solid #000000 !important; // } // 表头 // .kingRowIndex1 { // border-right: 2px solid #000000 !important; // }}</style>