基于element-ui封装一个Table模板组件
大家在做后台管理系统的时候,写的最多的可能就是表格页面了,一般分三部分:搜索功能区、表格内容区和分页器区。一般这些功能都是使用第三方组件库实现,比如说element-ui
,或者vuetify
。这两个组件库都各有各的优点,但就table
组件来说,我还是比较喜欢vuetify
的实现,不用手写一个个column
,只要传入headers的配置数组就行,甚至分页器都内置在了table
组件里,用起来十分方便。有兴趣可以看看:vuetify data table。
上面是一个经典的用element-ui
开发的table
页面,而且实际工作中如果每个table
页面都写一遍,重复代码太多了,所以不妨写一个table
模板组件,减少重复代码。我的思路是这样的:
-
搜索功能区:
提供
searchBar
插槽,可以自定义搜索输入框,搜索、重置按钮必有,新增按钮通过props
控制显隐。这里对应的代码如下:genSearchBar() { if (this.noSearchBar || !this.$scopedSlots.searchBar) return ''; return (
{this.$scopedSlots.searchBar()} ); }查询 重置 新增 -
表格内容区:
通过传入
headers
自动生成columns
,参数如下:{ label: '性别', prop: 'sex', width: '180', filter: 'sexFilter' }
可对应如下代码:
{{scope.row.sex | sexFilter}} 注意,只支持全局
filter
。如果你想自定义
column
,也提供tableColumn
插槽,支持自定义column
,可以如下配置:{ prop: 'action' }
编辑 删除 这样,就会按传入的
prop
匹配对应的column
,十分方便。实现代码如下:
genTableSlot(h) { let customeColumns = this.$scopedSlots.tableColumn ? this.$scopedSlots.tableColumn() : []; return this.headers.map((item) => { // 根据item.prop判断是否使用传入的插槽内容 let foundItem = customeColumns.find( (ele) => ele.componentOptions && ele.componentOptions.propsData.prop === item.prop ); return foundItem ? foundItem : h('el-table-column', { props: { ...item, }, scopedSlots: { default: (props) => { // 根据传入的全局filter处理column数据 let filter = this.$options.filters[ item.filter ]; let itemValue = props.row[item.prop]; return h( 'span', filter ? filter(itemValue) : itemValue ); }, }, }); }); }
genTable(h) { return h( 'el-table', { ref: 'tableRef', props: { ...this.$attrs, data: this.data, }, on: { 'selection-change': (val) => { this.$emit('selection-change', val); }, }, }, [...this.genTableSlot(h)] ); }
-
分页器区:
如无特殊需求,分页器功能一致,所以直接内置。
实现代码如下:
genPagination() { return (
最后附完整代码和demo:
Demo:
姓名:{{ scope.row.name }}
住址:{{ scope.row.address }}
{{scope.row.name}}