分頁是項目中常會用到的,網上的插件也很多,但是有些功能太齊全反而不是必要的,所以抽時間自己寫了一下(小白寫代碼,若發現問題還請及時賜教,感激不盡……)
如圖,想要一個這樣的頁碼:
a. 上一頁、下一頁固定展示
b. 第一頁、最后一頁固定展示
c. 中間,即:左右...之間需要展示的頁碼個數可自定義
d. 可任意選擇頁面展示數據條數
一、不需要展示 ,只展示頁碼,需要定義3個變量:pageNum(當前頁碼)、totalNum(總頁碼)、middleSize(中間,即左右...之間需要展示的頁碼 個數)
1、totalNum <= middleSize+2時,只顯示1,2,3,4沒有...,(為什么是totalNum <= middleSize+2,而不是totalNum <= middleSize,這是因為第一個、最后一頁是固定展示的),totalNum=7,middleSize=5,展示情況如下圖:
2、pageNum <= middleSize時,右側...顯示,totalNum=8,middleSize=5,展示情況如下圖:
3、pageNum >= totalNum - ( middleSize - 1 )時,左側...顯示,totalNum=100, middleSize=5,展示情況如下圖:
4、除以上3種情況,左右兩側...都展示,那中間頁碼如何展示,代碼如下:
// ④ 展示左右兩側的'...' let pages = [1, '...']; // 當左右兩側的...都展示時,中間的頁碼該如何展示呢?其實就是 當前頁碼 - (中間要展示頁碼的個數/2向下取整) 到 當前頁碼 + (中間要展示頁碼的個數/2向下取整)即可 const half = Math.floor(this.middleSize/2); // 向下取整 for(let i=this.pageNum-half; i<=this.pageNum+half; i++) { pages.push(i); } pages.push('...'); pages.push(this.totalNum); return pages;
二、左側頁面展示條數代碼實現較簡單,可查看全部代碼:

1 <template> 2 <div class="pageContainer"> 3 <!-- 當前頁面展示多少條數據 --> 4 <div class="pageSizeInner"> 5 <div class="totalCount">共 {{totalCount}} 條</div> 6 <div class="pageSize"> 7 <select v-model="perPageCount" @change="changePerPageCount"> 8 <option :value="item" v-for="(item, index) in page_size" :key="index">{{item}}</option> 9 </select> 10 </div> 11 </div> 12 13 <!-- 頁碼部分 --> 14 <ul class="pagesInner"> 15 <!-- 上一頁 --> 16 <li class="page" :class="{noClick : pageNum == 1}" @click="preOrNext(-1)"> 17 <span>上一頁</span> 18 </li> 19 <!-- 頁碼 --> 20 <li class="page" :class="{actived : item === pageNum}" v-for="(item, index) in displayPages" :key="index" @click="select(item)"> 21 <span>{{item}}</span> 22 </li> 23 <!-- 下一頁 --> 24 <li class="page" :class="{noClick : pageNum == totalNum}" @click="preOrNext(1)"> 25 <span>下一頁</span> 26 </li> 27 </ul> 28 </div> 29 </template> 30 31 <script> 32 export default { 33 data() { 34 return { 35 totalCount: 9999, // 總共多少條數據 36 page_size: ['100條/頁', '200條/頁', '300條/頁', '400條/頁'], // 每頁展示多少條數據 37 pageNum: 1, // 當前頁碼 38 totalNum: 20, // 總頁碼 39 middleSize: 5, // 中間顯示幾個頁碼 40 perPageCount: 0, // 每頁展示多少條數據 41 } 42 }, 43 computed: { 44 // 展示頁碼 45 displayPages() { 46 // ① 只展示'上一頁'、'頁碼'、'下一頁' 47 if(this.totalNum <= this.middleSize + 2) { 48 let pages = []; 49 for(let i=1; i<=this.totalNum; i++) { 50 pages.push(i); 51 } 52 return pages; 53 }else if(this.pageNum <= this.middleSize) { // this.pageNum <= this.middleSize+2 54 // ② 只展示右側'...',只要當前頁碼小於或者等於要展示的中間頁碼時就展示 55 let pages = [1]; 56 for(let i=2; i<this.middleSize+1; i++) { 57 pages.push(i); 58 } 59 pages.push('...'); 60 pages.push(this.totalNum); 61 return pages; 62 }else if(this.pageNum >= this.totalNum - (this.middleSize - 1)) { 63 // ③ 只展示左側'...',主要當前頁碼 大於或等於 總頁碼-(中間要展示頁碼的個數 - 1)就展示 64 let pages = [1, '...']; 65 for(let i=this.totalNum-this.middleSize+1; i<=this.totalNum; i++) { 66 pages.push(i); 67 } 68 return pages; 69 }else { 70 // ④ 展示左右兩側的'...' 71 let pages = [1, '...']; 72 // 當左右兩側的...都展示時,中間的頁碼該如何展示呢?其實就是 當前頁碼 - (中間要展示頁碼的個數/2向下取整) 到 當前頁碼 + (中間要展示頁碼的個數/2向下取整)即可 73 const half = Math.floor(this.middleSize/2); // 向下取整 74 for(let i=this.pageNum-half; i<=this.pageNum+half; i++) { 75 pages.push(i); 76 } 77 pages.push('...'); 78 pages.push(this.totalNum); 79 return pages; 80 } 81 } 82 }, 83 mounted() { 84 // 每頁展示多少條數據 85 this.perPageCount = this.page_size[0]; 86 // 計算總頁碼是多少 87 this.totalNum = Math.ceil(this.totalCount/parseInt(this.perPageCount)); 88 }, 89 methods: { 90 // 點擊'上一頁'、'下一頁' 91 preOrNext(n) { 92 this.pageNum = this.pageNum + n; 93 this.pageNum <= 1 ? this.pageNum = 1 : this.pageNum > this.totalNum ? this.pageNum = this.totalNum : null; 94 // 作為子組件,當前頁碼發生改變時需要通知父組件 95 // this.$emit('pageNumChanged', this.pageNum); 96 }, 97 // 點擊'頁碼' 98 select(item) { 99 if(typeof item === 'string') return; 100 if(item == this.pageNum) return; 101 this.pageNum = item; 102 // 作為子組件,當前頁碼發生改變時需要通知父組件 103 // this.$emit('pageNumChanged', this.pageNum); 104 }, 105 // 選擇頁面展示條數,重新計算總頁碼 106 changePerPageCount() { 107 this.totalNum = Math.ceil(this.totalCount/parseInt(this.perPageCount)); 108 } 109 } 110 } 111 </script> 112 113 <style lang="scss" type="text/css"> 114 .pageContainer { 115 display: flex; 116 justify-content: space-between; 117 .pageSizeInner { 118 padding-top: 9px; 119 .totalCount { 120 display: inline-block; 121 margin-right: 5px; 122 } 123 .pageSize { 124 display: inline-block; 125 >select { 126 padding: 0 3px; 127 width: 100px; 128 height: 30px; 129 font-size: 12px; 130 border: 1px solid #eee; 131 border-radius: 2px; 132 box-sizing: border-box; 133 outline: none; 134 } 135 } 136 } 137 .pagesInner { 138 display: inline-block; 139 text-align: center; 140 font-size: 0; 141 li { 142 display: inline-block; 143 margin: 5px; 144 list-style: none; 145 >span { 146 display: block; 147 width: 46px; 148 height: 36px; 149 line-height: 36px; 150 text-align: center; 151 font-size: 12px; 152 border: 1px solid #eee; 153 border-radius: 5px; 154 cursor: pointer; 155 } 156 &.noClick { 157 >span { 158 cursor: no-drop; 159 // border-color: transparent; 160 } 161 } 162 &.actived { 163 >span { 164 border-color: #2d8cf0; 165 background-color: #2d8cf0; 166 color: #fff; 167 } 168 } 169 } 170 } 171 } 172 </style>
(注:記住一個原則就可實現分頁,右點左側頁碼個數 = middleSize, 左點右側頁碼個數 = middleSize,totalNum<=middleSize+2無點只有頁碼,除以上三種情況外左右兩側...都展示)