用vue寫一個分頁器代碼


分頁是項目中常會用到的,網上的插件也很多,但是有些功能太齊全反而不是必要的,所以抽時間自己寫了一下(小白寫代碼,若發現問題還請及時賜教,感激不盡……)

如圖,想要一個這樣的頁碼:

  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>
View Code

 

注:記住一個原則就可實現分頁,右點左側頁碼個數 = middleSize, 左點右側頁碼個數 = middleSize,totalNum<=middleSize+2無點只有頁碼,除以上三種情況外左右兩側...都展示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM