html+vue.js 實現分頁可相容IE

豆豆豆豆豆芽菜、發表於2020-11-06

當功能比較簡單,在單一html中使用vue.js分頁展示資料,並未安裝腳手架,或使用相關UI框架,此時需要手寫一個分頁器,不失為最合理最便捷的解決方案,

先看一下實現效果:

上程式碼:

1.簡單搞一搞 CSS,此處程式碼有摺疊

	[v-cloak] {
		display: none;
	}
	#app {
		text-align: center;
		padding-top: 300px;
                height:500px;
	}
	.pageContainer {
		width: 800px;
		margin: 100px auto;
		text-align: center;
		font-size: 14px;
		color: #A3A3A3;
	}
	.pageContainer ul.pagesInner {
		height: 30px;
		line-height: 30px;
		display: inline-block;
                padding: 0;
	}
	.pageContainer ul.pagesInner li {
		width: 30px;
		height: 30px;
		display: inline-block;
		border: 1px solid #E5E5E5;
		margin: 0 5px;
                list-style: none;
	}
	.pageContainer ul.pagesInner li.actived {
		background: #FF6200;
		color: #ffffff;
	}
	.pageContainer .page-size-box {
		position: relative;
		display: inline-block;
		width: 70px;
		border: 1px solid #E5E5E5;
		height: 30px; 
		line-height: 30px;
	}
	.pageContainer ul.size-option {
		display: inline-block;
		border: 1px solid #E5E5E5;
		position: absolute;
		margin: 0;
		padding: 0;
		left: 0;
		top: -120px;
		background: #ffffff;
	}
	.pageContainer ul.size-option li{
		list-style: none;
		width: 70px;
	}
	.pageContainer ul.size-option li:hover{
		color: #FF6200;
	}
	.pageContainer form {
		display: inline-block;
	}
	.pageContainer form input,
	.pageContainer button {
		outline: none;
		padding: 0;
		width: 46px;
		height: 30px;
		background: #ffffff;
		border: 1px solid #E5E5E5;
		color: #A3A3A3;
	}

2.簡單搞一搞 HTML

<div id="app" v-cloak @click="showOption=false">
  第{{pageIndex}}頁,  每頁顯示{{pageSize}}條
  <div v-show="pageTotalNum > 1" class="pageContainer">
      共{{dataListLength}}條
    <ul class="pagesInner">
      <li class="page" @click="prevOrNext(-1)"><span aria-hidden="true">&lt;</span></li>
      <li class="page" v-for="(item, index) in pages" :key="index" :class="{actived: item == pageIndex}" @click="selectPage(item)">
        <span>{{item}}</span>
      </li>
      <li class="page" @click="prevOrNext(1)"><span class="fa fa-chevron-right" aria-hidden="true">&gt;</span></li>
    </ul>
    <div class="page-size-box">
      <span @click.stop="showOption=!showOption">{{pageSize}}條/頁</span>
      <ul class="size-option" v-show="showOption">
        <li v-for="(item, index) in pageSizeList" :key="index" @click="pageSize=item;showOption=false">{{item}}條/頁</li>
      </ul>
    </div>
    跳至&nbsp;
      <form id="frm1">
            <input type="text" v-model="goToPage" style="text-align: center;">
      </form>
    &nbsp;頁&nbsp;
    button @click="handleGoToPage">確定</button>
  </div>
</div>

3.搞事情啦 ~~~~

首先分析一下分頁功能的實現思路:

  • 首頁和尾頁始終顯示,

  • 通過資料總條數dataListLength及每頁顯示條數pageSize,計算出總頁數pageTotalNum

  • 監聽watch一下,每頁顯示條數pageSize,重置當前頁碼pageIndex=1

  • 我設計的分頁每次最多顯示5個頁碼(大家可根據需求自行調整),剩餘部分 ... 代替,並設定不可點選,

  • 根據不同的總頁數和當前頁碼的切換,頁籤展示形態有所不同,展示形態如下圖對應序號展示

  1. 總頁數 <= 1,不顯示分頁器
  2. 總頁數 <= 5 && 總頁數 > 1,顯示全部頁碼
  3. 總頁數 > 5 && 當前頁面 <= 3 , 倒數第二個頁碼為...,頁碼從計算
  4. 總頁數 > 5 && 當前頁面 > 3 && 當前頁 < 總頁數 - 3 , 正倒數第二個頁碼都為..., 頁碼以當前頁碼計算,±1
  5. 總頁數 > 5 && 當前頁面 > 3 && 當前頁 > 總頁數 - 3 , 正數第二個頁碼為..., 頁碼從計算

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script> 	<!--相容IE -->
<script>
  var app = new Vue({
    el: "#app",
    data: {
      pageIndex: 1,
      goToPage: '',
      // pageTotalNum: 16,
      dataListLength:147,
      pageSize:20,
      pageSizeList:[20,30,50,100],
      showOption:false
    },
    methods: {
      prevOrNext: function(n) {
        this.pageIndex += n
        this.pageIndex <= 1 ? this.pageIndex = 1 : this.pageIndex > this.pageTotalNum ? this.pageIndex = this.pageTotalNum : null
      },
      selectPage: function(n) {
        if (n === this.pageIndex) return
        if (typeof n === 'string') return
        this.pageIndex = n
      },
      handleGoToPage: function() {
        this.pageIndex = this.goToPage <= 1 ? 1 : this.goToPage - 0 >= this.pageTotalNum - 0 ? this.pageTotalNum :
        this.goToPage
        this.goToPage = this.pageIndex
       },
    },
    computed: {
      pageTotalNum:function(){
        return this.dataListLength % this.pageSize == 0 ? this.dataListLength / this.pageSize : Math.floor(this.dataListLength / this.pageSize) + 1
      },
      pages: function () {
        // 每次最多顯示5個頁碼
        var c = this.pageIndex
        var t = this.pageTotalNum
        var p = []
        for (var i = 1; i <= t; i++) {
          p.push(i)
        }
        var l = p.length
        if (l <= 5) { // 總頁數<=5,顯示全部頁碼
          return p
        } else if (l > 5 && c <= 3) { // 總頁數>5 && 當前頁面<=3
          return [1, 2, 3, 4, '...', t] 
        } else if (l > 5 && c > 3 && c <= l - 2) { // 總頁數 > 5 && 當前頁面 > 3 && 當前頁 < 總頁數 - 3
          return [1, '...', c - 2, c - 1, c, '...', t]  
        } else { // 總頁數 > 5 && 當前頁面 > 3 && 當前頁 > 總頁數 - 3
          return [1, '...', t - 3, t - 2, t - 1, t] 
        }
      },
    },
    watch:{
      pageSize:function(nv,ov){
        this.pageIndex = 1
      }
    }
  });
</script>

相關文章