一个可复用的vue分页组件

不废话,先上组件文件pages.vue:

<template>

<div class="pages-box" v-if="pageTotal > 0">

<ul class="pages">

<li class="pages-prev">

<a v-if="pageNow != 1" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="prevClick">上一页</a>

</li>

<!--如果只有一页就不显示固定的第一个分页按钮了,避免重复-->

<template v-if="pageTotal > 1">

<li v-for="i in pageBegin" class="pages-li" :class="{active:i == pageNow}">

<span v-if="i == pageNow" v-text="i"></span>

<a v-else href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="pageClick" v-text="i"></a>

</li>

</template>

<li v-if="ellipsis[0] > slider">

<span>...</span>

</li>

<li v-for="i in pageMiddle" class="pages-li" :class="{active:i == pageNow}">

<span v-if="i == pageNow" v-text="i"></span>

<a v-else href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="pageClick" v-text="i"></a>

</li>

<li v-if="pageTotal - ellipsis[1] > slider">

<span>...</span>

</li>

<li v-for="i in pageEnd" class="pages-li" :class="{active:i == pageNow}">

<span v-if="i == pageNow" v-text="i"></span>

<a v-else href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="pageClick" v-text="i"></a>

</li>

<li class="pages-next">

<a v-if="pageNow != pageTotal" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="nextClick">下一页</a>

</li>

</ul>

</div>

</template>

<script>

export default{

name: 'pages',

props: {

//总页数

total: {

type: [Number, String],

required: true

},

//当前页

now: {

type: [Number, String],

default: 1

}

},

data() {

return {

//当前页

pageNow: this.now,

//总页数

pageTotal: this.total,

//输入的页码

pageNum: "",

//显示分页按钮的个数

length: 8,

//前后固定的分页按钮个数

slider: 1

}

},

watch: {

total(val){

let page_total = parseInt(val);

page_total = (isNaN(page_total) || page_total < 1) ? 1 : page_total;

this.pageTotal = page_total;

},

now(val){

let page_now = parseInt(val);

page_now = (isNaN(page_now) || this.pageTotal < 2 || page_now < 1) ? 1 : page_now;

page_now = page_now > this.pageTotal ? this.pageTotal : page_now;

this.pageNow = page_now;

}

},

computed: {

//前边显示固定分页数

pageBegin(){

return Math.min(this.slider, this.ellipsis[0]);

},

//中间显示分页数

pageMiddle(){

let arr = [];

for (let i = this.ellipsis[0] + 1; i <= this.ellipsis[1]; i++) {

arr.push(i);

}

return arr;

},

//后边显示分页数

pageEnd(){

let arr = [];

for (let i = this.ellipsis[2] + 1; i <= this.pageTotal; i++) {

arr.push(i);

}

return arr;

},

/**

* 出现三个点时的分页的范围

* @returns {*[]}

* begin: 开始页码

* end: 结束页码

* end_max: 结束页码的最大值

*/

ellipsis() {

let end_max = this.pageTotal - this.slider;

let begin = this.pageNow - (this.length / 2) + this.slider;

begin = begin < 1 ? 1 : begin;

let end = begin + this.length - 2 * this.slider;

//当begin达到最小值后需要根据begin重新计算end以保证显示的分页按钮个数不变

end = begin < this.slider ? (end + this.slider - begin) : end;

if (end >= end_max) {

end = end_max;

//当end达到最大值后需要根据end重新计算begin以保证显示的分页按钮个数不变

begin = (end - this.length + 2 * this.slider) < 1 ? 1 : (end - this.length + 2 * this.slider);

}

return [begin, end, end_max];

}

},

methods: {

//上一页

prevClick() {

this.pageNow--;

this.pageNow = this.pageNow < 1 ? 1 : this.pageNow;

this.changePage(this.pageNow);

},

//下一页

nextClick() {

this.pageNow++;

this.pageNow = this.pageNow > this.pageTotal ? this.pageTotal : this.pageNow;

this.changePage(this.pageNow);

},

//点击页码

pageClick(e) {

this.pageNow = Number(e.target.innerText.trim());

this.changePage(this.pageNow);

},

//输入页码

pageInput(e){

let num = parseInt(e.target.innerText);

if(isNaN(num)){

this.pageNum = '';

e.target.innerText = '';

} else {

this.pageNum = num;

//e.target.innerText = num;

}

},

//跳转到输入的页码

goClick() {

this.pageNum = this.pageNum < 1 ? 1 : this.pageNum;

this.pageNum = this.pageNum > this.pageTotal ? this.pageTotal : this.pageNum;

this.pageNow = this.pageNum;

this.pageNum = "";

this.changePage(this.pageNow);

},

// 切换分页

changePage(page){

let {name, params, query} = this.$route;

this.$router.push({

name,

params: Object.assign(params, {page}),

query

});

}

}

}

</script>

<style lang="sass" type="text/scss" rel="stylesheet/scss">

@import '../scss/base/variables';

.pages-box{

position: relative;

padding: 5px 10px;

margin: 20px 0;

text-align: center;

}

.pages{

display: inline-block;

padding: 10px 0;

&:after{

content: "";

display: table;

line-height: 0;

clear: both;

}

li{

float: left;

height: 20px;

line-height: 20px;

text-align: center;

margin: 0 2px;

box-sizing: border-box;

font-size: 13px;

span, a{

display: block;

width: 100%;

height: 100%;

padding: 0 2px;

box-sizing: border-box;

}

}

.pages-li{

min-width: 30px;

border: 1px solid $theme;

color: $theme;

a{

color: $theme;

}

&.active{

span{

background: $theme;

color: #fff;

}

}

}

.pages-prev, .pages-next{

padding: 0 8px;

font-size: 12px;

a{

display: block;

height: 100%;

position: relative;

color: $theme;

&:before{

content: '';

position: absolute;

top: 50%;

display: block;

width: 6px;

height: 6px;margin-top:-4px;

border-left: 1px solid $theme;

border-top: 1px solid $theme;

}

}

}

.pages-prev a{

padding-left: 8px;

&:before{

transform:rotate(-45deg);

left: 0;

}

}

.pages-next a{

padding-right: 8px;

&:before{

transform:rotate(135deg);

right: 0;

}

}

.pages-num{

.num-input{

min-width: 20px;

height: 20px;

padding: 0 5px;

line-height: 20px;

border-radius: 2px;

border: 1px solid $theme;

color: $theme;

text-align: center;

outline: none;

}

}

.pages-go{

a{

color: $theme;

}

span{

color: #666;

}

}

}

</style>

使用方法:

在需要分页的地方使用分页组件标签,比如这里的order.vue:

<!--分页组件-->

<pages :now="page" :total="totalPage" v-if="totalPage > 0"></pages>

在data中设置当前页和总页面的默认值

data(){

return {

totalPage:1,

page:1,

}

},

考虑一下我们希望我们点击页数按钮后发生什么

首先,点击某页数时路由会改变页数,从路由获取当前页

this.page = this.$route.params.page;

接着,我们希望有一个getorderfromServer方法将当前页数发送给服务器,再将返回的数据更新在页面上

getorderfromServer({

currentPage:this.page

})

最后调用的方法:

methods: {

// 查询全部订单

getorderfromServer(){

this.loading = true;

this.page = this.$route.params.page;

getorderfromServer({

currentPage: this.page,

orderTimeStart:this.orderTimeStart,

orderTimeEnd:this.orderTimeEnd,

serviceName:this.serviceName,

shopName:this.shopName,

status: this.status

}).then(({code, data}) => {

if (code == 200) {

this.Orderlist = data.list;

this.totalPage = data.totalPage;

}

this.loading = false;

}).catch(err => {

this.tip('服务内部错误', 'error');

this.Orderlist = {};

this.loading = false;

});

},

}

注意通过路由对方法作出响应,每次路由改变都调用此方法以更新页面

watch: {

$route: 'getorderfromServer'

}

还要对路由信息进行改造,让每一页(尤其是第一页)都有路由页数信息,可以对第一页进行重定向以达到目的:

{

path: 'order',

redirect: 'order/page/1',

},

{

path: 'order/page/:page',

component(resolve){

require.ensure([], function (require) {

resolve(require('../modules/personal/order/myorder.vue'));

}, 'modules/personal')

},

name:'order',

meta: {

login: 'none'

}

},

以上是 一个可复用的vue分页组件 的全部内容, 来源链接: utcz.com/z/319748.html

回到顶部