vue仿element实现分页器效果


Posted in Javascript onSeptember 13, 2018

1 .起因

今日看完element中分页器的源码实现,比较简单,遂自己按着理解实现了一个简单的分页器,记录下来,以便日后温习.

2.实现难点

分页器的实现难点主要是什么时候显示分页器的省略, 我的思路是: 规定一个值foldPage, 意为当前最多显示的标签数,当总页数超过即显示省略.省略分为左边省略(folder1)和右边省略(folder2),布局代码如下:

<div class="pagination" @click="pageClick">
    <button class="pre">上一页</button>
    <ul class="pages">
      <li :class="['first', { 'active' : current == 1 }]" v-if="total">
        1
      </li>
      <li :class="[ testLeft,goback]"
        v-show="showPreMore"
        @mouseenter="testLeft='more-left'"
        @mouseleave="testLeft='more'"></li>
      <li :class="['page-item', { 'active' : current == item }]" v-for="item in $pages">
        {{ item }}
      </li>
      <li :class="[ testRight,gogo]" 
        v-show="showNextMore"
        @mouseenter="testRight='more-right'"
        @mouseleave="testRight='more'"></li>
      <li :class="['last', { 'active' : current == $last }]" v-if="total">
        {{ $last }}
      </li>
    </ul>
    <button class="next">下一页</button>
  </div>

$pages是一个计算属性,用于动态生成中间的页码,以及控制folder1和folder2的显示,代码如下:

computed:{
    // 中间页数组
    $pages(){
      const foldPage = this.foldPage 
      const current = Number(this.current)
      const halfFoldPage = Math.floor((foldPage-2)/2) 
      if (this.$last > foldPage){
        if (current - halfFoldPage > 2){
          this.showPreMore = true
        }else {
          this.showPreMore = false
        }
        if (current + halfFoldPage < this.$last){
          this.showNextMore = true
        }else {
          this.showNextMore = false
        }
      }
      let array = []
      // folder1显示
      if (this.showNextMore && !this.showPreMore){
        for(let i = 2; i < foldPage; i++){
          array.push(i)
        }
      // folder1 和 folder2都显示
      }else if ( this.showPreMore && this.showNextMore ){
        for(let i = current - halfFoldPage; i <= current + halfFoldPage; i++ ){
          array.push(i)
        }
      // folder2显示
      }else if (!this.showNextMore && this.showPreMore){
        // 当folder2显示的时候,页码不能大于$last,需要往前多显示差额
        let dis = current + halfFoldPage - this.$last + 1;
        for(let i = current - halfFoldPage - dis ; i < this.$last; i++){
          array.push(i)
        }
      // 都不显示
      }else {
        for(let i = 2; i < this.$last; i++){
          array.push(i)
        }
      }
      return array
    },
    // 总页数
    $last(){             
      return Math.ceil(this.total/this.size)
    }
  }

所有的点击都用一个函数处理, 根据e.target判断点击的目标.从而做出相应的逻辑:

methods:{
    pageClick(e){
      let newPage = Number(e.target.textContent)
      this.current = Number(this.current);

      if (!isNaN(newPage) && newPage){
        this.current = newPage
      }else {
        // 下一页
        if (e.target.className.indexOf('next') != -1){
          if (this.current == this.$last){
            return;
          }
          this.current ++
        }
        // 上一页
        else if (e.target.className.indexOf('pre') != -1){
          if (this.current == 1){
            return
          }
          this.current --
        }
        // 省略向左
        else if (e.target.className.indexOf('left') != -1){
          this.current -= this.foldPage - 2

          if (this.current <= 1){
            this.current = 1
            return
          }
        }
        // 省略向右
        else if(e.target.className.indexOf('right') != -1){
          this.current += this.foldPage - 2
          
          if (this.current >= this.$last){
            this.current = this.$last
            return 
          }
        }

      }
    }
  },

3.总结

pagination组件在element中算是一个很简单的组件,静下心来看不是很复杂,理解其思路以后可以自己尝试去写出来,细节可以无需在意.

总结

以上所述是小编给大家介绍的vue仿element实现分页器效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js实现广告漂浮效果的小例子
Jul 02 Javascript
JavaScript中的console.group()函数详细介绍
Dec 29 Javascript
解决ueditor jquery javascript 取值问题
Dec 30 Javascript
JavaScript实现更改网页背景与字体颜色的方法
Feb 02 Javascript
PHP结合jQuery实现红蓝投票功能特效
Jul 22 Javascript
浅谈Javascript中Object与Function对象
Sep 26 Javascript
jQuery自制提示框tooltip改进版
Aug 01 Javascript
浅谈Vue路由快照实现思路及其问题
Jun 07 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
Apr 17 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
Jun 20 Javascript
js实现简单页面全屏
Sep 17 Javascript
基于JavaScript实现控制下拉列表
May 08 Javascript
区别JavaScript函数声明与变量声明
Sep 12 #Javascript
详解js中Array的方法及技巧
Sep 12 #Javascript
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
Sep 12 #Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
Sep 12 #Javascript
angularjs的单选框+ng-repeat的实现方法
Sep 12 #Javascript
vue服务端渲染缓存应用详解
Sep 12 #Javascript
angularjs中判断ng-repeat是否迭代完的实例
Sep 12 #Javascript
You might like
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
javascript 文档的编码问题解决
2009/03/01 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
js实现返回顶部效果
2017/03/10 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
使用Python实现一个简单的项目监控
2015/03/31 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
python微信公众号开发简单流程
2018/03/23 Python
Python重新加载模块的实现方法
2018/10/16 Python
Python shutil模块用法实例分析
2019/10/02 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
优秀毕业生推荐信
2013/11/02 职场文书
公司财务工作总结的自我评价
2013/11/23 职场文书
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
销售经理竞聘书
2014/03/31 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
大学课外活动总结
2014/07/09 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书