/* * FileName: lb-table.vue * Remark: element table * Project: lb-element-table * Author: 任超 * File Created: Tuesday, 19th March 2019 9:55:27 am * Last Modified: Tuesday, 19th March 2019 9:55:34 am * Modified By: 任超 */ <template> <div :class="['lb-table', customClass]"> <el-table v-if="!heightNumSetting" class="table-fixed" :row-style="{ height: '50px' }" ref="elTable" :border='border' :row-class-name="tableRowClassName" :show-header='showHeader' :header-cell-style="{ background: 'rgb(236, 245, 255)' }" v-bind="$attrs" :height="tableHeight" v-on="$listeners" :data="data" style="width: 100%" :span-method="this.merge ? this.mergeMethod : this.spanMethod"> <lb-column v-bind="$attrs" v-for="(item, index) in column" :key="index" :column="item"> </lb-column> </el-table> <el-table v-else ref="elTable" class="table-fixed" :row-style="{ height: '50px' }" :border='border' :row-class-name="tableRowClassName" :show-header='showHeader' :header-cell-style="{ background: 'rgb(236, 245, 255)' }" v-bind="$attrs" :max-height="maxHeight" v-on="$listeners" :data="data" style="width: 100%" :span-method="this.merge ? this.mergeMethod : this.spanMethod"> <lb-column v-bind="$attrs" v-for="(item, index) in column" :key="index" :column="item"> </lb-column> </el-table> <br> <el-pagination class="lb-table-pagination" v-if="pagination" v-bind="$attrs" v-on="$listeners" background :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next" @current-change="paginationCurrentChange" :style="{ 'margin-top': paginationTop, 'text-align': paginationAlign }"> </el-pagination> </div> </template> <script> import LbColumn from './lb-column' export default { props: { column: Array, data: Array, spanMethod: Function, pagination: { type: Boolean, default: true, }, border: { type: Boolean, default: true, }, showHeader: { type: Boolean, default: true, }, paginationTop: { type: String, default: '0', }, heightNum: { type: Number, default: 265, }, maxHeight: { type: Number, default: 500 }, heightNumSetting: { type: Boolean, default: false, }, customClass: { type: String, default: '', }, paginationAlign: { type: String, default: 'left', }, merge: Array, }, components: { LbColumn, }, data () { return { tableHeight: '', mergeLine: {}, mergeIndex: {}, } }, created () { this.getMergeArr(this.data, this.merge) this.getHeight() }, computed: { dataLength () { return [] || this.data.length }, }, methods: { tableRowClassName ({ row, rowIndex }) { if (rowIndex % 2 === 1) { return 'interlaced'; } }, getHeight () { if (!this.heightNumSetting) { this.tableHeight = window.innerHeight - this.heightNum } }, clearSelection () { this.$refs.elTable.clearSelection() }, toggleRowSelection (row, selected) { this.$refs.elTable.toggleRowSelection(row, selected) }, toggleAllSelection () { this.$refs.elTable.toggleAllSelection() }, toggleRowExpansion (row, expanded) { this.$refs.elTable.toggleRowExpansion(row, expanded) }, setCurrentRow (row) { this.$refs.elTable.setCurrentRow(row) }, clearSort () { this.$refs.elTable.clearSort() }, clearFilter (columnKey) { this.$refs.elTable.clearFilter(columnKey) }, doLayout () { this.$refs.elTable.doLayout() }, sort (prop, order) { this.$refs.elTable.sort(prop, order) }, paginationCurrentChange (val) { this.$emit('p-current-change', val) }, getMergeArr (tableData, merge) { if (!merge) return this.mergeLine = {} this.mergeIndex = {} merge.forEach((item, k) => { tableData.forEach((data, i) => { if (i === 0) { this.mergeIndex[item] = this.mergeIndex[item] || [] this.mergeIndex[item].push(1) this.mergeLine[item] = 0 } else { if (data[item] === tableData[i - 1][item]) { this.mergeIndex[item][this.mergeLine[item]] += 1 this.mergeIndex[item].push(0) } else { this.mergeIndex[item].push(1) this.mergeLine[item] = i } } }) }) }, mergeMethod ({ row, column, rowIndex, columnIndex }) { const index = this.merge.indexOf(column.property) if (index > -1) { const _row = this.mergeIndex[this.merge[index]][rowIndex] const _col = _row > 0 ? 1 : 0 return { rowspan: _row, colspan: _col, } } }, }, watch: { merge () { this.getMergeArr(this.data, this.merge) }, dataLength () { this.getMergeArr(this.data, this.merge) } }, } </script> <style rel="stylesheet/scss" scoped lang="scss"> .lb-table { margin-top: 1px; .interlaced { background: #fafcff; border: 1px solid #ebf2fa; } } /deep/.el-table .cell { padding-left: 3px; padding-right: 3px; } </style>