mixins在表格分页数据展示中的应用

当系统中存在很多带分页的表格数据展示时,可以使用混入(mixins)减少代码量。

在混入中设置表格的设置表格最小高度,并预先设置好分页。

mixins/windowResize.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
const mixin = {
data() {
const page = {
index: 1,
size: 20,
total: 20,
list: [20, 50, 100]
};
return {
page
};
},
mounted() {
window.addEventListener('resize', this.onWindowResize);
this.$nextTick(() => {
this.onWindowResize();
});
},
destroyed() {
window.removeEventListener('resize', this.onWindowResize);
},
methods: {
onWindowResize: function() {
//获取表格距离顶部的距离
let offsetTopValue = this.$el.querySelector('.tableInfoBox').getOffset().top;
//获取窗口可视区域
let innerHeight = window.innerHeight;
//计算最小高度
let minHeight = innerHeight - offsetTopValue - 20;
minHeight = minHeight < 200 ? 200 : minHeight;
//设置表格最小高度
this.$el.querySelector('.tableInfoBox').style.minHeight = minHeight + 'px';
this.$el.querySelector('.tableInfoBox .ivu-table-tip span').style.minHeight = minHeight - 50 + 'px';
},
go(index) {
this.page.index = index;
this.loadData(index);
},
size(size) {
this.page.size = size;
this.loadData();
}
}
};

export default mixin;

mixins/index.js:

1
2
3
import WindowSize from './windowResize';

export { WindowSize};

example.vue:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<template>
<div class='tableInfoBox' :class="{hasDataAndPage:!!tableData.length}">
<Table v-scoped
border
:columns="columnsData"
:data="tableData"
no-data-text="">
</Table>
<div class="webPage" style="border: 0;">
<Page v-if="tableData && tableData.length !== 0"
class="Pager"
placement="top"
:total="page.total"
:page-size="page.size"
:current="page.index"
:page-size-opts="page.list"
show-sizer
show-elevator
show-total
@on-change="go"
@on-page-size-change="size">
</Page>
</div>
</div>
</template>

<script>
import { WindowSize} from '@/views/mixins';
mixins: [WindowSize],
data() {
return {
// data中不必再定义page
columnsData: [],
tableData: []
}
},
created(){
this.loadData(); // 获取table数据方法必须为loadData
},
methods:{
loadData(pageIndex = 1) {
if (pageIndex) this.page.index = pageIndex; //重置表格的页码
let queryData = {
page: this.page.index, //传递分页参数
pageSize: this.page.size
};
Object.assign(queryData, this.searchData);
this.$api['accurateTeaching/tableData'](queryData).then(data => {
this.page.total = data.totalCount;
this.tableData = data.dataList;
});
},
}
</script>

@/utils/index.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HTMLElement.prototype.getOffset = function(stopSelectorElement) {
let offsetParent = this.offsetParent;
let top = this.offsetTop,
left = this.offsetLeft;
while (offsetParent) {
top += offsetParent.offsetTop;
left += offsetParent.offsetLeft;
offsetParent = offsetParent.offsetParent;
if (stopSelectorElement && offsetParent === stopSelectorElement) {
break;
}
}
return {
top: top,
left: left,
width: this.offsetWidth,
height: this.offsetHeight
};
};

@/index.js:

1
import '@/utils';

注意点:

  1. 类名为tableInfoBoxhasDataAndPagewebPage。详见iView常见全局样式
  2. 获取table数据方法必须为loadData
  3. 上例中异步获取数据详见Vue封装axios