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 相关文章推荐
发现的以前不知道的函数
Sep 19 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
Jul 10 Javascript
快速学习jQuery插件 Cookie插件使用方法
Dec 01 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
Aug 19 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
Dec 04 Javascript
jQuery事件详解
Feb 23 Javascript
微信小程序 swiper组件构建轮播图的实例
Sep 20 Javascript
layui之select的option叠加问题的解决方法
Mar 08 Javascript
利用Angular2的Observables实现交互控制的方法
Dec 27 Javascript
vue 路由守卫(导航守卫)及其具体使用
Feb 25 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
Jul 18 Javascript
uniapp微信小程序实现一个页面多个倒计时
Nov 01 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
第十一节 重载 [11]
2006/10/09 PHP
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
一个加载js文件的小脚本
2007/06/28 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
[01:36]极致酷炫!TI9典藏宝瓶+撼地者至宝展示
2019/06/11 DOTA
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
Python中用于检查英文字母大写的isupper()方法
2015/05/19 Python
简单上手Python中装饰器的使用
2015/07/12 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
python分布式环境下的限流器的示例
2017/10/26 Python
python实现扫描日志关键字的示例
2018/04/28 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
客户答谢会致辞
2015/01/20 职场文书
材料员岗位职责范本
2015/04/11 职场文书
php png失真的原因及解决办法
2021/10/24 PHP
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS