vue-fantable
Version:
Vue table component for huge data
310 lines (276 loc) • 7.36 kB
JSX
import Pager from './pager.jsx'
import VeSelect from '@P/ve-select/ve-select.js'
import VeIcon from '@P/ve-icon/ve-icon.js'
import { COMPS_NAME, LOCALE_COMP_NAME } from './util/constant'
import { clsName } from './util/index'
import { createLocale } from '@P/src/locale/index'
import { ICON_NAMES } from '@P/ve-icon/src/util/constant'
const t = createLocale(LOCALE_COMP_NAME)
export default {
name: COMPS_NAME.VE_PAGINATION,
components: {
Total: {
render() {
return (
<span class={clsName('total')}>
{t('total', this.$parent.total)}
</span>
)
},
},
Prev: {
render() {
return (
<li
onClick={this.$parent.prevPage}
class={[
this.$parent.newPageIndex === 1
? clsName('disabled')
: '',
clsName('li'),
clsName('prev'),
]}
>
<a>
<VeIcon name={ICON_NAMES.LEFT_ARROW} />
</a>
</li>
)
},
},
Pager,
Next: {
render() {
return (
<li
onClick={this.$parent.nextPage}
class={[
this.$parent.newPageIndex === this.$parent.pageCount
? clsName('disabled')
: '',
clsName('li'),
clsName('next'),
]}
>
<a>
<VeIcon name={ICON_NAMES.RIGHT_ARROW} />
</a>
</li>
)
},
},
Sizer: {
render() {
return (
<VeSelect
class={clsName('select')}
value={this.$parent.newPageSizeOption}
popperAppendTo={this.$parent.popperAppendTo}
onInput={this.handleChange}
// v-model={this.$parent.newPageSizeOption}
/>
)
},
methods: {
handleChange(items) {
if (Array.isArray(items) && items.length > 0) {
const item = items.find((x) => x.selected)
if (item) {
this.$parent.pageSizeChangeHandler(item.value)
}
}
},
},
},
Jumper: {
methods: {
jumperEnter(event) {
if (event.keyCode !== 13) return
const val = this.$parent.getValidNum(event.target.value)
event.target.value = val
this.$parent.jumpPageHandler(val)
},
},
render() {
return (
<span class={clsName('goto')}>
{t('goto')}
<input
class={clsName('goto-input')}
domProps-value={this.$parent.newPageIndex}
onKeyup={this.jumperEnter}
type="input"
/>
{t('page')}
</span>
)
},
},
},
props: {
layout: {
type: Array,
default() {
return ['total', 'prev', 'pager', 'next', 'sizer', 'jumper']
},
},
// 总条数
total: {
type: Number,
required: true,
},
// 当前页
pageIndex: {
type: Number,
default: 1,
},
// 最多显示几个数字按钮
pagingCount: {
type: Number,
default: 5,
},
// 每页大小
pageSize: {
type: Number,
default: 10,
},
// 每页大小下拉配置
pageSizeOption: {
type: Array,
default: function () {
return [10, 20, 30]
},
},
// popper append to element
popperAppendTo: {
type: [String, HTMLElement],
default: function () {
return document.body
},
},
},
emits: ['pageNumberChange', 'pageSizeChange'],
data() {
return {
newPageIndex:
this.pageIndex && this.pageIndex > 0
? parseInt(this.pageIndex)
: 1,
newPageSize: this.pageSize,
}
},
computed: {
pageCount() {
return Math.ceil(this.total / this.newPageSize)
},
newPageSizeOption() {
return this.pageSizeOption.map((x) => {
const temp = {}
temp.value = x
temp.label = x + t('itemsPerPage')
if (this.newPageSize === x) {
temp.selected = true
}
return temp
})
},
},
watch: {
pageIndex (newVal) {
this.newPageIndex = newVal
},
pageSize(newVal) {
this.newPageSize = newVal
},
},
methods: {
getValidNum(value) {
let result = 1
value = parseInt(value, 10)
if (isNaN(value) || value < 1) {
result = 1
} else {
if (value < 1) {
result = 1
} else if (value > this.pageCount) {
result = this.pageCount
} else {
result = value
}
}
return result
},
jumpPageHandler(newPageIndex) {
this.newPageIndex = newPageIndex
// this.$emit(EMIT_EVENTS.PAGE_NUMBER_CHANGE, this.newPageIndex)
this.$emit('pageNumberChange', this.newPageIndex)
},
// 上一页
prevPage() {
if (this.newPageIndex > 1) {
this.newPageIndex = this.newPageIndex - 1
// this.$emit(EMIT_EVENTS.PAGE_NUMBER_CHANGE, this.newPageIndex)
this.$emit('pageNumberChange', this.newPageIndex)
}
},
// 下一页
nextPage() {
if (this.newPageIndex < this.pageCount) {
this.newPageIndex = this.newPageIndex + 1
// this.$emit(EMIT_EVENTS.PAGE_NUMBER_CHANGE, this.newPageIndex)
this.$emit('pageNumberChange', this.newPageIndex)
}
},
// 改变页面大小
pageSizeChangeHandler() {
const item = this.newPageSizeOption.find((x) => x.selected)
if (item) {
this.newPageSize = item.value
this.newPageIndex = 1
// this.$emit(EMIT_EVENTS.PAGE_SIZE_CHANGE, this.newPageSize)
this.$emit('pageSizeChange', this.newPageSize)
}
},
// 回到初始页码
goBackPageIndex() {
this.newPageIndex =
this.pageIndex && this.pageIndex > 0
? parseInt(this.pageIndex)
: 1
},
// 还原每页大小
goBackPageSize() {
if (this.pageSize > 0) {
this.newPageSize = this.pageSize
}
},
},
render() {
// const template =
const comps = {
// 'total','prev','pager','next','sizer','jumper'
total: <total></total>,
prev: <prev></prev>,
pager: (
<pager
pageCount={this.pageCount}
pageIndex={this.newPageIndex}
pagingCount={this.pagingCount}
onJumpPageHandler={this.jumpPageHandler}
></pager>
),
next: <next></next>,
sizer: <sizer></sizer>,
jumper: <jumper onJumpPageHandler={this.jumpPageHandler}></jumper>,
}
// template.children = template.children || []
// this.layout.forEach((item) => {
// template.children.push(comps[item])
// })
return <ul class="ve-pagination">
{this.layout.map((compoName) => {
return comps[compoName]
})}
</ul>
},
}