表格通用封装

198 阅读1分钟

表格通用封装

<template>
    <div class="table-container">
        <el-table
            ref="tableBase"
            v-loading="loading"
            class="table-wrap"
            :height="tableHeight"
            :data="listData"
            @selection-change="handleSelectionChange"
            @select="select"
        >
            <template v-for="(item, index) in columns">
                <!--复选框(START)-->
                <el-table-column
                    v-if="item.type == 'selection'"
                    :key="index"
                    :selectable="item.selectFn"
                    type="selection"
                    :width="item.width || 60"
                    :align="item.align || 'center'"
                    :fixed="item.fixed"
                />
                <el-table-column
                    v-else
                    :key="index"
                    :prop="item.prop"
                    :label="$t(item.label)"
                    :min-width="100"
                    :width="item.width"
                    :align="item.align || 'center'"
                    :show-overflow-tooltip="item.tooltip === false ? false : true"
                    :fixed="item.fixed"
                >
                    <template slot="header" slot-scope="scope">
                        <template v-if="item.isRenderHeader">
                            <slot name="header" :row="scope.row" :index="scope.$index" />
                        </template>
                        <template v-else>
                            <span>{{ $t(item.label) }}</span>
                        </template>
                    </template>
                    <template slot-scope="scope">
                        <template v-if="item.render">
                            <custom-cell :column="item" :row="scope.row" :render="item.render" :index="scope.$index" />
                        </template>
                        <template v-else-if="item.slot">
                            <slot :name="item.slot" :row="scope.row" :index="scope.$index" />
                        </template>
                        <template v-else>
                            <span>{{ item.format ? item.format(scope.row, item.prop) : scope.row[item.prop] || '-'}}</span>
                        </template>
                    </template>
                </el-table-column>
                <!--复选框(END)-->
            </template>

            <!-- v-for="(item, index) in columns" -->
        </el-table>
        <el-pagination
            v-if="paginationVisible"
            :current-page="currentPage"
            :page-sizes="pageSizeOption"
            :page-size="pageSize"
            layout="sizes, total, prev, pager, next, jumper"
            :total="total"
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
        />
    </div>
</template>

<script>
export default {
    name: '',
    components: {
        customCell: {
            functional: true,
            props: {
                row: Object,
                render: Function,
                index: Number,
                column: { type: Object, default: null }
            },
            render: (h, ctx) => {
                const { row, index, column, render } = ctx.props
                const params = { row, index, column }
                return render(h, params)
            }
        }
    },
    props: {
        columns: {
            type: Array,
            default: () => []
        },
        listData: {
            type: Array,
            default: () => []
        },
        total: {
            type: Number,
            default: 0
        },
        pageSizeOption: {
            type: Array,
            default: () => [10, 20, 50, 100]
        },
        pageSize: {
            type: Number,
            default: 10
        },
        currentPage: {
            type: Number,
            default: 1
        },
        loading: {
            type: Boolean,
            default: false
        },
        // total: {
        //     type: Number,
        //     default: 100
        // },
        paginationVisible: {
            type: Boolean,
            default: true
        },
        tableHeight: {
            type: String,
            default: '100%'
        }
    },
    data() {
        return {
            multipleSelection: []
        }
    },
    computed: {},
    watch: {},
    mounted() {},
    activated() {
        this.doLayout()
    },
    methods: {
        /* 多选 */
        handleSelectionChange(val) {
            this.multipleSelection = val
            this.$emit('selectionChange', val)
        },
        /* pageSize改变 */

        handleSizeChange(val) {
            this.$emit('update:pageSize', val)
            this.$emit('sizeChange', val)
        },
        /* currentPage改变 */

        handleCurrentChange(val) {
            this.$emit('currentChange', val)
        },
        select(selection, row) {
            this.$emit('select', selection, row)
        },

        doLayout() {
            this.$refs.tableBase.doLayout()
        }
    }
}
</script>

<style scoped lang="scss">
.table-container {
    height: 100%;
    ::v-deep {
        .el-table th {
            background-color: #e4e8f1;
        }
        .el-table td,
        .el-table th {
            padding: 8px 0;
        }
        .el-pagination {
            display: flex;
            margin-top: 30px;
            > .el-pagination__sizes {
                margin-right: auto !important;
            }
        }
    }
}
</style>

<style lang="scss">
.el-tooltip__popper {
    max-width: 30%;
}
</style>

引入使用方法

<table-base :table-height="'300'" :columns="columns" :list-data="driversInfo" :pagination-visible="false">

import tableBase from '@/components/TableBase/index.vue'

data() {
    return {
        requiredFields: '',
        columns: [
            {
                label: 'car.management.driver.name',
                prop: 'name'
            },
            {
                label: 'car.management.driver.id',
                prop: 'idNumber'
            },
            {
                label: 'car.management.org',
                prop: 'orgName'
            },
            {
                label: 'car.management.mobileNumber',
                prop: 'mobileNumber'
            }
        ],
    }
},