一個可復(fù)用的vue分頁組件
本文實(shí)例為大家分享了可復(fù)用vue分頁組件的具體代碼,供大家參考,具體內(nèi)容如下
不廢話,先上組件文件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);" @click="prevClick">上一頁</a>
</li>
<!--如果只有一頁就不顯示固定的第一個分頁按鈕了,避免重復(fù)-->
<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);" @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);" @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);" @click="pageClick" v-text="i"></a>
</li>
<li class="pages-next">
<a v-if="pageNow != pageTotal" href="javascript:void(0);" @click="nextClick">下一頁</a>
</li>
</ul>
</div>
</template>
<script>
export default{
name: 'pages',
props: {
//總頁數(shù)
total: {
type: [Number, String],
required: true
},
//當(dāng)前頁
now: {
type: [Number, String],
default: 1
}
},
data() {
return {
//當(dāng)前頁
pageNow: this.now,
//總頁數(shù)
pageTotal: this.total,
//輸入的頁碼
pageNum: "",
//顯示分頁按鈕的個數(shù)
length: 8,
//前后固定的分頁按鈕個數(shù)
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: {
//前邊顯示固定分頁數(shù)
pageBegin(){
return Math.min(this.slider, this.ellipsis[0]);
},
//中間顯示分頁數(shù)
pageMiddle(){
let arr = [];
for (let i = this.ellipsis[0] + 1; i <= this.ellipsis[1]; i++) {
arr.push(i);
}
return arr;
},
//后邊顯示分頁數(shù)
pageEnd(){
let arr = [];
for (let i = this.ellipsis[2] + 1; i <= this.pageTotal; i++) {
arr.push(i);
}
return arr;
},
/**
* 出現(xiàn)三個點(diǎn)時的分頁的范圍
* @returns {*[]}
* begin: 開始頁碼
* end: 結(jié)束頁碼
* end_max: 結(jié)束頁碼的最大值
*/
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;
//當(dāng)begin達(dá)到最小值后需要根據(jù)begin重新計算end以保證顯示的分頁按鈕個數(shù)不變
end = begin < this.slider ? (end + this.slider - begin) : end;
if (end >= end_max) {
end = end_max;
//當(dāng)end達(dá)到最大值后需要根據(jù)end重新計算begin以保證顯示的分頁按鈕個數(shù)不變
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);
},
//點(diǎn)擊頁碼
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;
}
},
//跳轉(zhuǎn)到輸入的頁碼
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>
使用方法:
在需要分頁的地方使用分頁組件標(biāo)簽,比如這里的order.vue:
<!--分頁組件--> <pages :now="page" :total="totalPage" v-if="totalPage > 0"></pages>
在data中設(shè)置當(dāng)前頁和總頁面的默認(rèn)值
data(){
return {
totalPage:1,
page:1,
}
},
考慮一下我們希望我們點(diǎn)擊頁數(shù)按鈕后發(fā)生什么
首先,點(diǎn)擊某頁數(shù)時路由會改變頁數(shù),從路由獲取當(dāng)前頁
this.page = this.$route.params.page;
接著,我們希望有一個getorderfromServer方法將當(dāng)前頁數(shù)發(fā)送給服務(wù)器,再將返回的數(shù)據(jù)更新在頁面上
getorderfromServer({
currentPage:this.page
})
最后調(diào)用的方法:
methods: {
// 查詢?nèi)坑唵?
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('服務(wù)內(nèi)部錯誤', 'error');
this.Orderlist = {};
this.loading = false;
});
},
}
注意通過路由對方法作出響應(yīng),每次路由改變都調(diào)用此方法以更新頁面
watch: {
$route: 'getorderfromServer'
}
還要對路由信息進(jìn)行改造,讓每一頁(尤其是第一頁)都有路由頁數(shù)信息,可以對第一頁進(jìn)行重定向以達(dá)到目的:
{
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'
}
},
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue項(xiàng)目中使用setTimeout存在的潛在問題及解決
這篇文章主要介紹了Vue項(xiàng)目中使用setTimeout存在的潛在問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
Vue3中v-if和v-for優(yōu)先級實(shí)例詳解
Vue.js中使用最多的兩個指令就是v-if和v-for,下面這篇文章主要給大家介紹了關(guān)于Vue3中v-if和v-for優(yōu)先級的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
vant picker+popup 自定義三級聯(lián)動案例
這篇文章主要介紹了vant picker+popup 自定義三級聯(lián)動案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

