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 相关文章推荐
使用jQuery轻松实现Ajax的实例代码
Aug 16 Javascript
js弹出层之1:JQuery.Boxy (二)
Oct 06 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
Dec 17 Javascript
javascript中判断一个值是否在数组中并没有直接使用
Dec 17 Javascript
jQuery使用技巧简单汇总
Apr 18 Javascript
jquery ajax中使用jsonp的限制解决方法
Nov 22 Javascript
js强制把网址设为默认首页
Sep 29 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
Sep 04 Javascript
js实现九宫格拼图小游戏
Feb 13 Javascript
AngularJS下$http服务Post方法传递json参数的实例
Mar 29 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
Sep 23 Javascript
vue循环中点击选中再点击取消(单选)的实现
Sep 10 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
如何利用php+mysql保存和输出文件
2006/10/09 PHP
php实现mysql封装类示例
2014/05/07 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
jQuery插件学习教程之SlidesJs轮播+Validation验证
2016/07/12 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
HTML5 中新的全局属性(整理)
2013/07/31 HTML / CSS
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
关于是否需要写商业计划书
2014/02/07 职场文书
绘画专业自荐信范文
2014/02/23 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
工程建设实施方案
2014/03/14 职场文书
公司联欢会策划方案
2014/05/19 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
同志主要表现材料
2014/08/21 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
python中subplot大小的设置步骤
2021/06/28 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python