170 lines
5.2 KiB
Plaintext
170 lines
5.2 KiB
Plaintext
<template>
|
||
<el-row>
|
||
<el-col class="m-b-10" :span="24">
|
||
<el-table
|
||
v-adaptive="{bottomOffset}"
|
||
:data="list"
|
||
:height="tableHeight"
|
||
v-bind="$attrs"
|
||
stripe
|
||
:highlight-current-row="highlightCurrentRow"
|
||
@selection-change="handleSelectionChange"
|
||
@sort-change="sortByColumn"
|
||
@select="handleSelect"
|
||
@cell-dblclick="celldblclick"
|
||
>
|
||
<template v-for="(column, index) in columns">
|
||
<slot name="front-slot" />
|
||
<!-- 序号 -->
|
||
<el-table-column v-if="column.type === 'selection'" :key="index" type="selection" width="55" />
|
||
<!-- 复选框 -->
|
||
<el-table-column v-else-if="column.type === 'index'" :key="index" type="index" width="50" />
|
||
<!-- 具体内容 -->
|
||
<el-table-column v-else :key="index" align="left" :label="column.label" :width="column.width" :min-width="column.minWidth" :show-overflow-tooltip="column.showOverflowTooltip || false" :sortable="column.sortable || false" :prop="column.prop">
|
||
<template slot-scope="scope">
|
||
<!-- 仅仅显示文字 -->
|
||
<span v-if="!column.hidden"> <!-- 如果hidden为true的时候 那么当前格可以不显示,可以选择显示自定义的slot-->
|
||
<!-- 操作按钮 -->
|
||
<span v-if="column.type === 'operate'">
|
||
<!-- <a v-for="(operate, i) in column.operates" :key="i" href="javascript:void(0)" class="operate-button" @click="handleClick(operate, scope.row)">
|
||
{{ operate.name }}
|
||
|
||
</a> -->
|
||
<span v-for="(operate, i) in column.operates" :key="i">
|
||
<el-button :size="operate.size || 'mini'" :type="operate.type || 'primary'" style="margin-right:5px;" @click="handleClick(operate, scope.row)">{{ operate.name }}</el-button>
|
||
</span>
|
||
</span>
|
||
<span v-else>
|
||
{{ scope.row[column.prop] }}
|
||
</span>
|
||
</span>
|
||
<!-- 使用slot的情况下 -->
|
||
<span v-if="column.slot">
|
||
<!-- 具名slot -->
|
||
<slot v-if="column.slot" :name="column.slot" :scope="scope" />
|
||
</span>
|
||
</template>
|
||
</el-table-column>
|
||
<!-- 匿名slot -->
|
||
</template>
|
||
<slot />
|
||
</el-table>
|
||
</el-col>
|
||
<!-- 分页部分 -->
|
||
<el-col v-if="!hiddenPage" :span="24" class="page">
|
||
<pagination :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="pagination" />
|
||
</el-col>
|
||
</el-row>
|
||
</template>
|
||
<script>
|
||
/**
|
||
* @author
|
||
* @todo 项目中基本使用表格
|
||
* @slot 1: defaultSlot:插入表格一行 2: front-slot:默认在表格开始处加一行 3:column内slot
|
||
* @property
|
||
* list => 表格数据
|
||
* columns: [ ==> 配置表格头
|
||
* key: => 渲染字段名称
|
||
* title: => 表头名称
|
||
* operates: => 操作数组 [
|
||
* name: 名称
|
||
* emitKey: 要emit出去的事件
|
||
* ]
|
||
* ]
|
||
* demo columns
|
||
* headers: [
|
||
{ type: 'selection'},
|
||
{ type: 'index'},
|
||
{ key: 'loginName', title: 'XXX' },
|
||
{ key: 'userName', title: 'XXX' },
|
||
{ key: 'roleName', title: 'XXX', hidden: true, slot: 'roleSlot' },
|
||
{ key: 'createDate', title: 'XXX' },
|
||
// operate 这一行可以选择直接使用slot或者是使用配置项
|
||
{ type: 'operate', title: 'XXX',
|
||
operates: [
|
||
{ name: 'XXX', emitKey: 'reset' },
|
||
{ name: 'XXX', emitKey: 'edit' },
|
||
{ name: 'XXX', emitKey: 'delete' }
|
||
] }
|
||
]
|
||
*/
|
||
import Pagination from '@/components/Pagination'
|
||
export default {
|
||
name: 'BaseTable',
|
||
components: { Pagination },
|
||
props: {
|
||
// 核心数据
|
||
list: {
|
||
type: Array,
|
||
default: () => []
|
||
},
|
||
|
||
// columns
|
||
columns: {
|
||
type: Array,
|
||
required: true,
|
||
default: () => []
|
||
},
|
||
// is hidden page for table
|
||
hiddenPage: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
bottomOffset: {
|
||
type: Number,
|
||
default: 45
|
||
},
|
||
searchData: {
|
||
type: Object,
|
||
default: () => {}
|
||
},
|
||
total: {
|
||
type: Number,
|
||
default: 0
|
||
},
|
||
highlightCurrentRow: {
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
},
|
||
data() {
|
||
return {
|
||
}
|
||
},
|
||
computed: {
|
||
tableHeight() {
|
||
return 100
|
||
}
|
||
},
|
||
methods: {
|
||
// 处理点击事件
|
||
handleClick(action, data) {
|
||
// emit事件
|
||
this.$emit(`${action.emitKey}`, data)
|
||
},
|
||
// 选中变化
|
||
handleSelectionChange(val) {
|
||
this.$emit('handleSelectionChange', val)
|
||
},
|
||
handleSelect(rows, row) {
|
||
this.$emit('handleSelect', rows, row)
|
||
},
|
||
celldblclick(row, column) {
|
||
this.$emit('celldblclick', row, column)
|
||
},
|
||
sortByColumn(column) {
|
||
this.$emit('sortByColumn', column)
|
||
},
|
||
pagination() {
|
||
this.$emit('getList')
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.page{
|
||
padding-top: 3px;
|
||
text-align: right;
|
||
}
|
||
</style>
|