vue-data-tables
Version:
A simple, customizable and pageable table, based on vue2 and element-ui.
166 lines (146 loc) • 4.59 kB
Markdown
# Pagination
The pagination of `vue-data-tables` is a embedded [el-pagination](http://element.eleme.io/#/en-US/component/pagination), `vue-data-tables` provide property `pagination-props`, `current-page` and `page-size` to customize it.
* `current-page`: set the current page number, supports the .sync modifier
* `page-size`: set item count of each page,supports the .sync modifier
* `pagination-props`: Similar to [table-props](en-us/basic.md?id=pass-props-to-the-embedded-el-table),used to pass props to the embedded [el-pagination](http://element.eleme.io/#/en-US/component/pagination) with a `js` Object
In the following example, options of item count per page is set to [1, 2, 3]; item count of each page is set to 1; current page is set to 2; pagination background is also set.
```html
/*vue*/
<template>
<data-tables :data="data"
:current-page='2'
:page-size='1'
:pagination-props='{ background: true, pageSizes: [1, 2, 3] }'>
<el-table-column v-for="title in titles"
:prop="title.prop"
:label="title.label"
:key="title.prop"
/>
</data-tables>
</template>
<script>
export default {
data() {
return {
data,
titles
}
}
}
</script>
```
With sync modifier, it's convenient to control the page change with `javascript`:
```html
/*vue*/
<template>
<div>
<div style='margin-bottom: 10px;'>
<span>currentPage: </span>
<el-input-number v-model='currentPage'></el-input-number>
</div>
<data-tables-server
:data="data"
:total='total'
:current-page.sync='currentPage'
:page-size='pageSize'
:pagination-props='{ background: true, pageSizes: [1, 2, 3] }'
@query-change='loadData'>
<el-table-column v-for="title in titles"
:prop="title.prop"
:label="title.label"
:key="title.prop"/>
</data-tables>
</div>
</template>
<script>
export default {
data() {
return {
data,
titles,
total: 0,
currentPage: 2,
pageSize: 1
}
},
methods: {
async loadData(queryInfo) {
console.log('queryInfo: ', queryInfo)
let { data, total } = await http(queryInfo)
this.data = data
this.total = total
}
}
}
</script>
```
# Pagination of data-tables-server
Same to [Sort](en-us/sort?id=sort-of-data-tables-server) and [Filter](en-us/filter?id=filter-of-data-tables-server) of `data-tables-server`, `data-tables-server` doesn't take charge the data `pagination` either, the `pagination` is also handled by back-end server. What `data-tables-server` need to do is emitting the pagination information when the pagination information changes, so that the back-end server can paginate and return new data according to the information.
Pagination information includes `item count of each page` and `current page`. When these 2 items change, `data-tables-server` emits emits a event named `query-change`.
* When `item count of each page` changes, the event is emitted with type `size`.
* When `current page` changes, the event is emitted with type `page`.
The payload of `query-info` event has property `page` and `pageSize`, which respectively represent `item count of each page` and `current page`.
Example to demonstrate how to handle `query-info` for pagination.
```html
/*vue*/
<template>
<data-tables-server
:data='data'
:total='total'
@query-change='loadData'
:pagination-props='{ pageSizes: [5, 10, 15] }'>
<el-table-column v-for="title in titles"
:prop="title.prop"
:label="title.label"
:key="title.label"
sortable="custom">
</el-table-column>
</data-tables-server>
</template>
<script>
export default {
data() {
return {
data,
titles,
total: 0,
}
},
methods: {
async loadData(queryInfo) {
(queryInfo.type === 'page' ||
queryInfo.type === 'size') &&
this.$message(`page: ${queryInfo.page}, pageSize: ${queryInfo.pageSize}`)
let { data, total } = await http(queryInfo)
this.data = data
this.total = total
}
}
}
</script>
```
# support for pagination slot (3.4.5+)
```html
/*vue*/
<template>
<data-tables :data="data"
:pagination-props='{ layout: "sizes, prev, pager, next, jumper, ->, total, slot" }'>
<el-table-column v-for="title in titles"
:prop="title.prop"
:label="title.label"
:key="title.prop"
/>
</data-tables>
<span slot="pagination" style='color: red'>I am slot</span>
</template>
<script>
export default {
data() {
return {
data,
titles
}
}
}
</script>
```