表格中咱们常常须要动态加载数据, 若是有多个页面都须要用到表格, 那我但愿能够有个组件, 只传数据过去显示, 不用每一个页面都去写这么一段内容:vue
1 <el-table :data="tableData" border size="mini" fit highlight-current-row height="500"> 2 <el-table-column type="index" align="center" fixed></el-table-column> 3 <el-table-column prop="DHM" min-width="140px" label="时间" align="center"></el-table-column> 4 <el-table-column prop="PLAZANO" min-width="100px" label="编码" align="center"></el-table-column> 5 <el-table-column prop="PLAZANAME" min-width="100px" label="名称" align="center"></el-table-column> 6 <el-table-column prop="CAR_PLATE" label="号码" align="center"></el-table-column> 7 <el-table-column prop="CARD_NO" min-width="120px" label="卡号" align="center"></el-table-column> 8 <el-table-column prop="DATATYPE" label="数据类型" align="center" :formatter="formatDATATYPE"></el-table-column> 9 <el-table-column prop="STAFFNAME" min-width="100px" label="姓名" align="center"></el-table-column> 10 <el-table-column prop="MEDIATYPE" label="付款方式" align="center"></el-table-column> 11 <el-table-column prop="COMP_CASH" label="计算费额" align="center"></el-table-column> 12 <el-table-column prop="FACT_CASH" label="实收费额" align="center"></el-table-column> 13 <el-table-column label="操做" min-width="140px" align="center"> 14 <template slot-scope="scope"> 15 <el-button @click="handleClick(scope.row)" type="text" size="small">查看</el-button> 16 <el-button type="text" size="small">编辑</el-button> 17 </template> 18 </el-table-column> 19 </el-table>
上面这段代码是一个element-ui中tabele表格的形式,这里表头都是已经固定的, 若是每一个页面都写上这么一段, 不一样的是表头名字和字段,这样子就有点重复,并且页面的篇幅也就比较大了,因而把这块写成一个组件, 每一个页面引入这个组件, 再传入数据。element-ui
1. 表格组件:ui
1 <el-table :data="tableData" border size="mini" fit highlight-current-row height="500" :row-style="rowStyle" @row-dblclick="rowDblclick" 2 v-loading="loading" 3 element-loading-text="拼命加载中" 4 element-loading-spinner="el-icon-loading" 5 element-loading-background="rgba(0, 0, 0, 0.3)"> 6 <el-table-column type="index" align="center" fixed></el-table-column> 7 <!-- prop: 字段名name, label: 展现的名称, fixed: 是否须要固定(left, right), minWidth: 设置列的最小宽度(不传默认值), oper: 是否有操做列 8 oper.name: 操做列字段名称, oper.clickFun: 操做列点击事件, formatData: 格式化内容 --> 9 <el-table-column v-for="(th, key) in tableHeader" 10 :key="key" 11 :prop="th.prop" 12 :label="th.label" 13 :fixed="th.fixed" 14 :min-width="th.minWidth" align="center"> 15 <!-- 加入template主要是有操做一栏, 操做一栏的内容是相同的, 数据不是动态获取的,不过我这里操做一栏的名字定死了(oper表示是操做这一列,不然就不是) --> 16 <template slot-scope="scope"> 17 <div v-if="th.oper"> 18 <el-button v-for="(o, key) in th.oper" :key="key" @click="o.clickFun(scope.row)" type="text" size="small">{{o.name}}</el-button> 19 </div> 20 <div v-else> 21 <span v-if="!th.formatData">{{ scope.row[th.prop] }}</span> 22 <span v-else>{{ scope.row[th.prop] | formatters(th.formatData) }}</span> 23 </div> 24 </template> 25 </el-table-column> 26 </el-table>
// 这里是传入的数据
1 props: { 2 tableData: { 3 type: Array, 4 default: function () { 5 return [] 6 } 7 }, 8 rowDblclick: { 9 type: Function, 10 default: (row, event, column) => { console.log('default: ' + row + '---' + event + '---' + column) } 11 }, 12 tableHeader: { 13 type: Array, 14 default: function () { 15 return [] 16 } 17 }, 18 loading: { 19 type: Boolean, 20 default: false 21 } 22 },
1 <table :tableData="tableData" :rowDblclick="rowDblclick" :tableHeader="tableHeader" :loading="loading"></table>
其中 tableData是表格中要显示的数据内容, 这个内容个人是从后台查询出来的, rowDblclick 是双击一行作的操做,若是不须要能够删除, tableHeader 是表头显示的数据, loading 是表格加载的loading方式, 默认是没有的this
表头数据格式以下: formatData 是表格里面的数据须要作处理的方法, oper是操做列,查看和编辑是两个按钮,handleClick和editClick点击按钮的方法, 自行补充。编码
1 export const tableHeader = [ // 表头数据
2 { prop: 'dhm', label: '时间', minWidth: '140px' },
3 { prop: 'plazano', label: '编码', minWidth: '100px' }, 4 { prop: 'plazano', label: '名称', minWidth: '100px', formatData: val => store.getters.allPlazano2Map.get(val) }, 5 { prop: 'car_plate', label: '号码' }, 6 { prop: 'card_no', label: '卡号', minWidth: "120px" }, 7 { prop: 'laneno', label: '数据类型', formatData: function(val) { return val.substr(2, 1) == '1' ? '出口' : '入口' } }, 8 { prop: 'staffname', label: '姓名', minWidth: '100px' }, 9 { prop: 'mediatype', label: '付款方式' }, 10 { prop: 'comp_cash', label: '计算费额' }, 11 { prop: 'fact_cash', label: '实收费额' }, 12 { prop: 'oper', label: '操做', fixed: 'right', minWidth: '140px', 13 oper: [ 14 { name: '查看', clickFun: handleClick }, 15 { name: '编辑', clickFun: editClick } 16 ] 17 } 18 ]
如今的代码可能会报错, 下面这处的代码是在全局注册了一个过滤器,若是不注册就找不到这个方法就会报错,因此还须要注册一个全局过滤器,若是你不须要对数据作处理能够不要这个过滤器spa
2. 注册全局过滤器, 个人是这样写的, 先新建个文件 filter.js 而后在里面写个方法, export 出去prototype
export function formatters(val, format) { if (typeof (format) === 'function') { return format(val) } else return val }
而后再在main.js中引入进来注册全局的过滤器:3d
import * as filters from './filters' Object.keys(filters).forEach(key => { Vue.filter(key, filters[key]) })
这个在每一个页面就均可以使用 formatters 这个过滤器方法了, 不过具体的过滤方法是由 format 这个参数传进去的, 这里主要是由于不一样的数据过滤的方法不同, 因此在表头传数据的时候就一并写上处理数据的方法code
若是不少地方都使用了同一个方法, 能够将这个方法注册成全局方法, 那么在每一个页面就能够直接使用该方法, 不用重复去写。orm
3. 注册全局方法
创建个js 文件(个人文件名为validate.js), 写入该方法, 这里使用 exports.install 注册全局方法,挂载到vue原型上
exports.install = (Vue, options) => { Vue.prototype.validator = { lanenoTransf(val) { return val.substr(2, 1) == '1' ? '出口' : '入口' } } }
而后在main.js中引入
import validator from '@/utils/validate' Vue.use(validator)
最后页面上就能够直接使用
{ prop: 'laneno', label: '数据类型', formatData: this.lanenoTransf },
最最后, 看个人表格: