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 调用WebService实现代码
Mar 24 Javascript
js格式化时间小结
Nov 03 Javascript
js+html5实现canvas绘制简单矩形的方法
Jun 05 Javascript
JavaScript实现基于十进制的四舍五入实例
Jul 17 Javascript
jquery实现select下拉框美化特效代码分享
Aug 18 Javascript
jQuery 限制输入字符串长度
Jun 20 Javascript
bootstrap实现图片自动轮播
Dec 21 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 Javascript
使用Vue自定义数字键盘组件(体验度极好)
Dec 19 Javascript
解决vue打包css文件中背景图片的路径问题
Sep 03 Javascript
Vue组件的使用及个人理解与介绍
Feb 09 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
Nov 03 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+jQuery实现动态展示信息
2011/10/08 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
PHP文件上传类实例详解
2016/04/08 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
关于Python中异常(Exception)的汇总
2017/01/18 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
Python扩展内置类型详解
2018/03/26 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
python如何导入依赖包
2020/07/13 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
争论的故事教学反思
2014/02/06 职场文书
说明书范文
2014/05/07 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
走群众路线剖析材料
2014/10/09 职场文书
2014全年工作总结
2014/11/27 职场文书
亮剑精神观后感
2015/06/05 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL
python套接字socket通信
2022/04/01 Python