效果圖
//代碼
<template>
<!-- 表格 -->
<div :id="id" class="tableList">
<el-table
v-if="renderOff"
ref="tableList"
:header-cell-style="{background:'#F5F7FA',color:'#666'}"
:class="['table-main', className]"
:data="renderData"
:stripe="stripe"
:height="tableHeight"
tooltip-effect="dark"
highlight-current-row
size="mini"
>
<el-table-column
v-for="(i, index) of renderHead"
:key="index"
size="mini"
:prop="i.prop"
:label="i.label"
:width="i.width"
:min-width="i.minWidth"
:fixed="i.fixed"
:align="i.align"
:show-overflow-tooltip="i.tooltip || true"
>
<!-- 表頭 支持自定義插槽 默認顯示label -->
<template slot="header" slot-scope="scope">
<slot :name="`table-head-${i.slotKey}`" :scope="scope">
<span class="table-default-th">{{ scope.column.label }}</span>
</slot>
</template>
<!-- 表格 支持自定義插槽 默認顯示prop內容 -->
<template slot-scope="scope">
<slot :name="`table-${i.slotKey}-${scope.$index}`" :scope="scope">
<span :style="i.style" :class="['table-default-td', i.className]">{{
formatValue(scope, i)
}}</span>
</slot>
</template>
</el-table-column>
<el-table-column
v-if="isActive"
fixed="right"
:width="activeWidth"
label="操作"
>
<template slot-scope="scope">
<el-button
v-for="(item, index) in active"
:key="index"
v-permission="item.pcode"
size="mini"
type="text"
@click="handlerTdClick(item.eventKey, scope)"
>{{ item.txt }}</el-button
>
</template>
</el-table-column>
</el-table>
<el-row v-if="isPage" type="flex" justify="end" align="middle" class="h60">
<el-pagination
:total="total"
:current-page="page.pageNumber"
:page-size="page.pageSize"
background
layout="total, prev, pager, next, jumper"
@current-change="handleCurrentChange"
/>
</el-row>
</div>
</template>
<script>
import tableHeight from "@/mixins/tableHeight";
export default {
name: "BaseTable",
mixins: [tableHeight],
props: {
// table ID
id: {
type: [String, Number],
default: "",
},
/** 表頭項
* {
* label:[String] 顯示的標題 ''
* prop:[String] 對應列內容的字段名 ''
* width:[String] 對應列的固定寬度 ''
* min-width:[String] 對應列的最小寬度(自適應) ''
* fixed:[String,Boolean] 列是否固定在左側或者右側 'true/left/right'
* align:[String] 對齊方式 'left/center/right'
* tooltip:[Boolean] 當內容過長被隱藏時顯示tooltip true
* className:[String] 類名 ''
* eventkey:[String] 自定義事件名稱 ''
* slotKey:[String] 自定義插槽鍵值 ''
* style:[Object]
* format:[Function] 過濾函數
* default:[String] 默認值
* }
*/
heads: {
type: Array,
default: () => [],
},
// 數據源
datas: {
type: Array,
default: () => [],
},
// 操作按鈕
active: {
type: Array,
default: () => [],
},
// 是否顯示操作列
isActive: {
type: Boolean,
default: true,
},
activeWidth: {
type: Number,
default: 100,
},
// 是否為斑馬紋
stripe: {
type: Boolean,
default: true,
},
// tableの類名
className: {
type: [String],
default: "",
},
// 分頁
page: {
type: Object,
default: () => ({}),
},
// 是否顯示分頁
isPage: {
type: Boolean,
default: true,
},
// 總條數
total: {
type: Number,
default: 0,
},
},
data() {
return {
// 渲染開關
renderOff: true,
// 渲染數據
renderData: [],
// 渲染表頭
renderHead: [],
// 表格配置
table: {},
};
},
watch: {
heads: {
handler(value) {
this.renderHead = value;
},
immediate: true,
deep: true,
},
datas: {
handler(value, oldList) {
this.renderData = value;
},
immediate: true,
deep: true,
},
},
mounted() {
this.$nextTick(() => {
this.getHeight();
});
},
methods: {
/* 點擊分頁 */
handleCurrentChange(val) {
this.$emit("currentPage", val);
},
/* 處理單元格內容 */
formatValue(scope, column) {
let text = scope.row[scope.column.property];
// 處理默認值
if (!text && text !== 0) {
if (typeof column.default === "string") {
return column.default;
} else return "-";
}
// 處理空數組
if (Array.isArray(text)) {
if (!text.length) return "-";
}
// 處理過濾函數
if (typeof column.format === "function") {
text = column.format(scope.row[scope.column.property]);
}
return text;
},
/* TD點擊事件 */
handlerTdClick(eventKey, scope) {
this.$emit(eventKey || "TD-click", scope.row);
},
},
};
</script>
<base-table
:id="baseTable"
:datas="tableList"
:heads="tableHeader"
:active="tableActive"
:page="page"
:total="total"
:stripe="false"
:active-width="activeWidth"
@editorData="editorData"
@delectData="delectData"
@currentPage="currentPage"
@resourceData="resourceData"
/>
//pcode 自定義指令傳權限code
data() {
return {
baseTable: 'baseTable',
tableHeader: [
{ label: '編號', prop: 'number' },
{ label: '項目類型', prop: 'name' },
{ label: '類型組', prop: 'projTypeGroupName' },
{ label: '項目屬性', prop: 'projectPropertyName' },
{ label: '學科', prop: 'subjectName' },
{ label: '任務類型', prop: 'projTaskTypeNames' } // todotodo
],
tableList: [],
tableActive: [
{ txt: '編輯', eventKey: 'editorData', pcode: [''] },
{ txt: '刪除', eventKey: 'delectData', pcode: [''] },
{
txt: '定義資源組',
eventKey: 'resourceData',
pcode: ['basic_data_update']
}
],
isActive: false,
activeWidth: 200,
page: {
pageNumber: 1,
pageSize: 20
},
total: 0
};
},
methods: {
editorData(){}
delectData(){}
currentPage(){}
resourceData(){}
}