<template>
<div class='tableBox'>
<div>
<el-table v-loading="loading"
element-loading-text="正在加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(255,255,255, 0.8)"
:data="tableData"
ref="multipleTable"
@selection-change="handleSelectionChange"
:highlightCurrentRow="highlightCurrentRow"
@current-change="handleCurrentChange"
:max-height="tableHeight"
@filter-change="filterTag"
@sort-change='sortChange'
@row-click="handleClick"
@cell-click="cellClick"
@expand-change="expandChange"
:span-method="arraySpanMethod"
border
style="width: 100%"
size="mini"
:row-class-name="rowClassName"
:cell-style="cellStyle"
:header-cell-style="headerCellStyle"
:row-key="rowId"
:show-header="status"
:id="tableId"
:lazy="lazy"
:load="loadChildren"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}">
<template v-for="(item, index) of model">
<el-table-column
v-if="item.type === 'expand'"
:type="item.type"
:prop="item.prop"
:width="item.width || 30"
:key="index">
<template slot-scope="scope">
<slot :name="item.prop" :row="scope.row" :$index="scope.$index"></slot>
</template>
</el-table-column>
<!-- 表格序列 -->
<el-table-column
fixed
v-else-if="item.type === 'index'"
:label="item.label"
:type="item.type"
:width="item.width || 60"
:key="index">
</el-table-column>
<el-table-column
sortable='custom'
v-else-if="item.type === 'sortable'"
:prop="item.prop"
:label="item.label"
:width="item.width"
:min-width="item.minWidth"
:key="index">
</el-table-column>
<!-- 多选表格 -->
<el-table-column
v-else-if="(item.type === 'selection') && (typeof(item.show)=='function'?item.show():(item.show!=undefined?item.show:true))"
:label="item.label"
:type="item.type"
:width="item.width"
:min-width="item.minWidth"
:fixed="item.fixed"
:key="index">
</el-table-column>
<!-- 自定义模板表格列 -->
<el-table-column
v-else-if="item.template"
:prop="item.prop"
:label="item.label"
:width="item.width"
:column-key="item.columnKey"
:filters="item.filters?item.filters:null"
:filter-multiple="item.filterMultiple?item.filterMultiple:null"
:min-width="item.minWidth"
:show-overflow-tooltip="true"
:align="item.align"
:fixed="item.fixed"
:key="index">
<template slot-scope="scope">
<slot :name="item.prop" :row="scope.row" :$index="scope.$index"></slot>
</template>
</el-table-column>
<!-- 原生element-ui列 -->
<el-table-column
v-else-if="!(item.type === 'selection') && (typeof(item.show)=='function'?item.show():(item.show!=undefined?item.show:true))"
:prop="item.prop"
:label="item.label"
:width="item.width"
:column-key="item.columnKey"
:filters="item.filters?item.filters:null"
:filter-multiple="item.filterMultiple?item.filterMultiple:null"
:min-width="item.minWidth"
:show-overflow-tooltip="true"
:align="item.align"
:fixed="item.fixed"
:key="index">
</el-table-column>
</template>
</el-table>
</div>
<!-- 反选按钮 -->
<div class="mtop10 invertBtn" v-if="isShowBtn">
<el-button type="primary" size="mini" plain @click="invertCheck">反选</el-button>
</div>
<!-- 表格分页 -->
<div class="text-center mtop10" v-if="isShowPage">
<el-pagination
background
layout="prev, pager, next, sizes, total, jumper"
:total="totalSize"
:current-page='page.pageNumber'
:page-size='page.pageSize'
:page-sizes='pageSizes'
@current-change='changePage'
@size-change='changeSize'
>
</el-pagination>
</div>
</div>
</template>
<script>
export default {
name: 'FrTable',
props: {
tableData: { type: Array, default () { return [] } },
totalSize: { type: Number, default: 0 },
/**
* @param {Array} model - 表格模型
* @param {String} model.label - 列头标题
* @param {String} model.prop - 列头字段名,对应的tableData中的key
* @param {String} model.template - 自定义列模板名称,对应slot的name
* @param {String} model.type - 列类型 可选值 index, checkbox
* @param {Boolean} model.hidden - 列是否隐藏
* @param {String} model.align 表格列对齐方式 可选值 left,right,center
*/
highlightCurrentRow: { type: Boolean, default: false },
model: { type: Array, required: true },
arraySpanMethod: {type: Function,default () { return function(){} } },
/***
* row为某一行的除操作外的全部数据
* column为某一列的属性
* rowIndex为某一行(从0开始数起)
* columnIndex为某一列(从0开始数起)
*/
cellStyle: {type: Function,default () { return function(){} } },
headerCellStyle: {type: Object,default () { return {} } },
rowClassName: {type: Function,default () { return function(){} } },
isShowPage: { type: Boolean, default: true },
isShowBtn: { type: Boolean, default: false },
rowId: { type: String, default: null },
lazy: { type: Boolean, default: false },
loadChildren:{ type: Function,default () { return function(){} } },
loading: { type: Boolean, default: false },
tableHeight: { type: Number, default: 500 },
status: { type: Boolean, default: true },
tableId: { type: String, default: null }
},
data () {
return {
page: {pageNumber: 1, pageSize: 10 },
pageSizes: [10, 20, 30, 50, 100, 200],
isChangePage: false, // 标志变量,是否为切换当前页
selectList: []
}
},
watch: {
tableHeight(newValue) {
this.tableHeight = newValue
},
immediate:true,//关键
deep:true// 深度监听父组件传过来对象变化
},
methods: {
sortChange(column, prop, order) {
this.page.order = column.order;
this.getTableList();
this.isChangePage = false;
},
expandChange(row){
this.$emit("expandChange", row)
},
getTableList () {
if (this.isChangePage) {
this.isChangePage = false
} else {
this.page.pageNumber = 1
}
this.$emit("getTableList", this.page);
},
// 当type为selection时,出发选择事件
handleSelectionChange (val) {
this.selectList = val
this.$emit('multipleSelect', val)
},
//行绑定事件
handleClick(val){
this.$emit("handleClick", val)
},
//单元格绑定事件
cellClick(row, column, cell, event){
this.$emit("cellClick", row, column, cell, event)
},
handleCurrentChange (val) {
// this.currentRow = val;
this.$emit('singleSelect', val)
},
// 页面跳转
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1、该封装的组件包含分页、反选、多选、过滤、排序、树形数据懒加载、单元格绑定事件、行绑定事件、指定行添加背景色等功能,这些功能可以自动控制是否显示; 2、控制列的显示隐藏、表格的高度根据窗口大小自动改变、动态设置列宽; 3、使用slot,灵活修改列的显示,例如通过标签或者输入框显示; 4、组件可以直接使用,使用简单,方便,有使用示例和注释,上手快; 5、经过多个项目使用,功能稳定; 6、遇到使用问题可以随时帮助解答。
资源详情
资源评论
资源推荐
收起资源包目录
table.rar (2个子文件)
table
demo.vue 2KB
components
FrTable.vue 9KB
共 2 条
- 1
LOVE_tenYear
- 粉丝: 192
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0