在很多前端的后管項目中會存在很多表格,表格數據過多就需要分頁和按條件篩選搜索查詢,於是就對el-table進行了二次封裝。
頁面結構如圖:
PS:以前做的組件了,大家可以酌情參考,也可根據實際情況進行修改擴展。
1、首先創建一個 searchForm.vue 文件,放置篩選查詢條件和按鈕。
<template> <el-form :label-width="labelWidth" label-position="right" size="small" class="search-form"> <el-container> <el-row ref="target" type="flex" class="search-form_row"> <slot></slot> <div class="el-form-item el-form-item--small"> <div class="el-form-item__content"> <el-button type="primary" size="small" @click="$emit('query')">查 詢</el-button> <el-button size="small" v-if="$slots.default" @click="$emit('reset')">重 置</el-button> </div> </div> </el-row> </el-container> </el-form> </template> <script> export default { name: 'SearchForm', props: { labelWidth: { type: String, default: '70px' }, } } </script>
2、創建 searchTable.vue 文件
<template> <el-container class="search-table"> <el-header class="search-table__header" v-if="$slots.row"> <search-form ref="form" :label-width="labelWidth" @query="$emit('query')" @reset="$emit('reset')"> <template> <slot name="row"></slot><!-- 搜索條件 & 按鈕 --> </template> </search-form> </el-header> <el-main class="search-table__body"> <el-row ref="actions" v-if="$slots.actions" class="search-table__action"> <el-col :span="24"> <slot name="actions"></slot><!-- 操作按鈕 --> </el-col> </el-row> <el-table ref="tableRef" :height="tableHeight" :data="tableData" :empty-text="emptyText" stripe border highlight-current-row :row-class-name="rowClassName" tooltip-effect="light" :header-cell-style="{ fontWeight: 'bold' }" size="mini" :row-key="rowKeys" v-loading="tableLoading" :default-sort="defaultSort" @sort-change="handleSortChange" @selection-change=" selection => { this.$emit('selectionChange', selection) }" @select-all=" selection => { this.$emit('selectAll', selection) }" > <slot></slot> </el-table> </el-main> <el-footer class="search-table__footer" height="42px" v-if="$slots.footer"> <slot name="footer"></slot> </el-footer> </el-container> </template> <script> import SearchForm from './searchForm' export default { name: 'SearchTable', components: { SearchForm }, props: { labelWidth: { type: String, default: '70px' }, tableData: { type: Array, default: () => [] }, emptyText: { type: String, default: '' }, rowClassName: { type: Function }, rowKeys: { type: Function }, tableLoading: Boolean, defaultSort: { type: Object, default: () => {} }, }, data() { return { tableHeight: '200px' //table表格高度 } }, methods: { // 表格排序 handleSortChange(event) { const { prop, order } = event this.$emit('sortChange', { prop, order: order ? String.prototype.replace.call(order, 'ending', '') : null }) } } } </script>
3、在組件中使用
<template> <el-card class="full-height full-width"> <search-table class="full-height full-width" :table-loading="loading" :tableData="tableData" :ref="tableRef" :labelWidth="'40px'" :row-keys="row => row.id" @query="currentPage = 1; query();" @reset="doReset" @selectionChange="selectionChange"> <template v-slot:row> <el-form-item label="姓名"> <el-input placeholder="請輸入內容" v-model="searchForm.name" clearable></el-input> </el-form-item> <el-form-item label="年齡"> <el-input placeholder="請輸入內容" v-model="searchForm.age" clearable></el-input> </el-form-item> <el-form-item label="性別"> <el-select placeholder="請選擇" v-model="searchForm.gender" clearable> <el-option :label="'運行中'" :value="0"></el-option> </el-select> </el-form-item> </template> <template v-slot:actions> <el-button size="small" type="primary">新 建</el-button> <el-button size="small" type="primary">批量刪除</el-button> <el-button size="small" type="primary">批量導出</el-button> </template> <template> <el-table-column :reserve-selection="true" type="selection" width="55" /> <el-table-column prop="id" label="姓名" show-overflow-tooltip /> <el-table-column prop="age" label="年齡" show-overflow-tooltip /> <el-table-column prop="gender" label="性別" show-overflow-tooltip /> <el-table-column prop="time" label="創建時間" show-overflow-tooltip /> </template> <template v-slot:footer> <el-pagination background :current-page="currentPage" :page-sizes="pageSizes" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total" @handleSizeChange="handleSizeChange" @handleCurrentChange="handleCurrentChange" /> </template> </search-table> </el-card> </template> <script> import SearchTable from '../views/components/searchTable' export default { components: { SearchTable }, data () { return { tableData: [], loading: false, tableRef: 'tableRef', searchForm: {}, currentPage: 1, pageSizes: [10, 20, 50], pageSize: 10, total: 0 }; }, methods: { query() { // 請求表格數據 }, doReset() { // 重置搜索條件 }, selectionChange() { // 表格選項發生變化 }, handleSizeChange(val) { // 改變每頁條數 }, handleCurrentChange(val) { // 切換頁碼 } } } </script>