引入vue.js实现分页操作

兼容IE、html+vue.js 实现分页操作


.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;

}



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>




首先分析一下分页功能的实现思路:

首页和尾页始终显示,

通过数据总条数dataListLength及每页显示条数pageSize,计算出总页数pageTotalNum

监听watch一下,每页显示条数pageSize,重置当前页码pageIndex=1

我设计的分页每次最多显示5个页码(大家可根据需求自行调整),剩余部分 ... 代替,并设置不可点击,

根据不同的总页数和当前页码的切换,页签展示形态有所不同,展示形态如下图对应序号展示

总页数 <= 1,不显示分页器

总页数 <= 5 && 总页数 > 1,显示全部页码

总页数 > 5 && 当前页面 <= 3 , 倒数第二个页码为...,页码从计算

总页数 > 5 && 当前页面 > 3 && 当前页 < 总页数 - 3 , 正倒数第二个页码都为..., 页码以当前页码计算,±1

总页数 > 5 && 当前页面 > 3 && 当前页 > 总页数 - 3 , 正数第二个页码为..., 页码从计算




js代码:

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容