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 相关文章推荐
csdn 批量接受好友邀请
Feb 19 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
Oct 17 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
Oct 21 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
Jun 23 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
Apr 12 Javascript
微信小程序多张图片上传功能
Jun 07 Javascript
Vue2.0实现组件数据的双向绑定问题
Mar 06 Javascript
微信小程序的部署方法步骤
Sep 04 Javascript
微信小程序冒泡事件及其阻止方法实例分析
Dec 06 Javascript
React 使用recharts实现散点地图的示例代码
Dec 07 Javascript
layui导出所有数据的例子
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
关于页面优化和伪静态
2009/10/11 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
js实现5秒倒计时重新发送短信功能
2017/02/05 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
jQuery简单实现的HTML页面文本框模糊匹配查询功能完整示例
2018/05/09 jQuery
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
python Django的web开发实例(入门)
2019/07/31 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
如何通过python实现人脸识别验证
2020/01/17 Python
python3让print输出不换行的方法
2020/08/24 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
查环查孕证明
2014/01/10 职场文书
冬季施工防火方案
2014/05/17 职场文书
六一亲子活动总结
2014/07/01 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP