Vue自定义表格组件
思考到最近在应用element框架开发治理后盾,用到表格组件的次数比拟多,简略做了一个数据展现型的表格组件,至于交互按钮下面还没有通过验证。
<br/>
表格列提供4种数据处理展现,文本(默认)、图片、匹配文本、匹配文本按钮,做一下解释。
字段 | 类型 | 必填 | 备注 |
---|---|---|---|
prop | String | 是 | 后盾返回的列字段(所有数据处理必填) |
showImage | Boolean | 否 | style字段自定义款式 |
options | Object[Object] | 否 | 匹配文本,格局如{1:{title:'文案1',type:'primary'}} |
onAction | Function | 否 | 用于匹配按钮事件传参 |
permission | Boolean | 否 | 用于提供匹配按钮权限 |
1.<Table>
组件代码
<template> <div class="w-match m-t-1"> <!-- 表格 --> <el-table :data="dataList" border fit highlight-current-row> <el-table-column label="序号" width="70" align="center"> <template slot-scope="scope"> {{ (page - 1) * limit + scope.$index + 1 }} </template> </el-table-column> <el-table-column v-for="item in columns" :prop="item.prop" :label="item.label" :key="item.prop"> <template slot-scope="scope"> <span v-if="!item.permission && item.options"> {{ item.options[scope.row[item.prop]]['title'] || scope.row[item.prop] }} </span> <img v-else-if="item.showImage" :src="scope.row[item.prop]" :style="item.style" class="w-match" alt=""> <el-button :type="item.options[scope.row[item.prop]].type" size="mini" icon="el-icon-edit" v-else-if="item.permission && item.onAction" @click="item.onAction(scope.row)"> {{ item.options[scope.row[item.prop]].title }} </el-button> <span v-else>{{ scope.row[item.prop] || '' }}</span> </template> </el-table-column> <el-table-column label="操作" align="center" width="200" v-if="actions && actions.length>0"> <template slot-scope="scope"> <div class="" v-for="item in actions" :key="item.name"> <el-button :type="item.type" :size="item.size||'mini'" @click="item.onAction(scope.row)" v-if="item.permission != undefined ? item.permission : true">{{ item.title }} </el-button> </div> <!-- <el-button type="danger" size="mini" @click="removeDataById(scope.row.id)"--> <!-- v-if="hasPerm('activity.delete')">删除--> <!-- </el-button>--> </template> </el-table-column> </el-table> <!-- 分页 --> <el-pagination :current-page="page" :page-size="limit" :total="total" style="padding: 30px 0; text-align: center;" layout="total, sizes, prev, pager, next, jumper" @current-change="getList" :page-sizes="[10, 20, 30, 40, 50, 100]" @size-change="handleSizeChange" /> </div></template><script>export default { name: "TableComponent", props: { dataList: { //数据源 type: Array, default: [], required: true }, total: { //页大小 type: Number, default: 0 }, columns: { //表格列 type: Array, default: [], required: true }, actions: { //表格按钮 type: Array, default: [], required: true }, onPageChange: { type: Function, default: null } }, data() { return { page: 1, limit: 10, } }, created() { this.getList() }, methods: { getList(page = 1) { this.page = page this.$emit("onPageChange", this.page, this.limit);//通知父组件页码发生变化 }, handleSizeChange(number) { this.limit = number this.$emit("onPageChange", this.page, this.limit);//通知父组件页大小发生变化 }, }}</script><style scoped></style>
<br/>
2.页面援用形式
<template> <div class="app-container"> <!--查问表单--> <el-form :inline="true" class="demo-form-inline"> <el-form-item prop="status"> <el-select v-model="dataQuery.status" clearable> <el-option label="上架" :value="1"></el-option> <el-option label="下架" :value="0"></el-option> </el-select> </el-form-item> <el-button type="primary" icon="el-icon-search" @click="queryList()">查问</el-button> <el-button type="default" @click="resetData()">重置</el-button> </el-form> <div class="w-match m-t-1"> <Table ref="table" :columns="tableColumn" :actions="tableAction" :data-list="list" :total="total" @onPageChange="getList"/> </div> </div></template><script>import api from '@/api'import Table from '@/components/Table/index'export default { name: "Page", components: { Table }, data() { return { list: [], total: 0, page: 1, limit: 10, dataQuery: {}, tableColumn: [ {prop: "createTime", label: "创立工夫"}, {prop: "mobile", label: "手机号"}, {prop: "memberTime", label: "会员时效"}, {prop: "redeemTime", label: "兑换工夫"}, { prop: "status", label: "是否兑换", width: 60, options: {1: {title: '是', type: 'success'}, 0: {title: '否', type: 'warning'}}, //待验证性能 // onAction:updateByStatus(row,rowIndex) // permission:hasPerm('gift.status') }, ], tableAction: [ //待验证性能 // { // title: '编辑', type: 'primary', // // permission: this.hasPerm('gift.update'), // onAction:(data)=>{console.log(data)} // } ] } }, watch: { $route(to, from) { //路由变动形式,路由发生变化,办法就会执行 this.getList() }, }, created() { this.getList() }, methods: { getList(page, limit) { if (page) this.page = page if (limit) this.limit = limit //数据申请接口 api.getList(this.dataQuery) .then(response => { //数据申请胜利解决 this.total = response.total this.list = response.data }) }, queryList() { this.$refs.table.getList()//重置表格为第一页 }, resetData() { this.dataQuery = {} this.$refs.table.getList()//重置表格为第一页 }, }}</script>