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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(6)
Dec 23 Javascript
jquery 插件实现图片延迟加载效果代码
Feb 06 Javascript
jquery validate.js表单验证的基本用法入门
May 13 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 Javascript
使用Raygun来自动追踪AngularJS中的异常
Jun 23 Javascript
js获取及判断键盘按键的方法
Dec 01 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
Jun 08 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
详解Angular4 路由设置相关
Aug 26 Javascript
关闭Vue计算属性自带的缓存功能方法
Mar 02 Javascript
nuxt 实现在其它js文件中使用store的方式
Nov 05 Javascript
使用vue判断当前环境是安卓还是IOS
Apr 12 Vue.js
区别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
在PHP中实现Javascript的escape()函数代码
2010/08/08 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
2016/02/26 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
jquery实现网页定位导航
2016/08/23 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
详解webpack babel的配置
2018/01/09 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
Python的Flask框架中web表单的教程
2015/04/20 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
Python通过文本和图片生成词云图
2020/05/21 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
吉列剃须刀美国官网:Gillette美国
2018/07/13 全球购物
亲属关系公证书
2014/04/08 职场文书
优秀党员先进材料
2014/12/18 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis