用Vue写一个分页器的示例代码


Posted in Javascript onApril 22, 2018

之前一直想要自己试着实现一个分页器,但是一直拖,今天写完,大概照着网易云音乐的样子来完成。这个小例子很简单,通过这个小例子,可以学习到Vue计算属性的使用,并了解到写分页器需要区分的情况。这篇文章会慢慢从头来实现这个小例子,相信你一定会学会,而且看完了我的思路之后说不定会有更棒的思路和想法!

实现的效果是这样子的:

用Vue写一个分页器的示例代码

一、先简单布局

<template>
 <div class="pageContainer">
  <ul class="pagesInner">
   <li class="page"><span class="fa fa-chevron-left" aria-hidden="true"></span></li>
   <li class="page" v-for="(item, index) in pages" :key="index">
    <span>{{item}}</span>
   </li>
   <li class="page"><span class="fa fa-chevron-right" aria-hidden="true"></span></li>
  </ul>
 </div>
</template>

<script>
export default {
 computed: {
  pages() {
   return 10;
  }
 }
};
</script>

效果如下:

用Vue写一个分页器的示例代码

有两个地方说下:

  1. 最前面和最后面两个icon用的font awesome的cdn
  2. 使用v-for来进行渲染的数据用的是计算属性里的pages,暂时写了一个数据11,所以渲染出了11个标签

二、理清思路,在这个例子里最重要

这篇文章的例子是参照了网易云音乐里的分页方法,网易的图:

用Vue写一个分页器的示例代码

它有几个特点:

  1. 首页和尾页一直都有
  2. 最多时候有11个标签页,包括两个 ... ,但是它们不能点击,所以我也把例子里的页码设为11
  3. 在当前页变动的时候,页码的形态也会发生变化,总共有三种情况,这个下面会细说

分页的三种情况:

第一种:当前页码小于等于5的时候

如图:

用Vue写一个分页器的示例代码

这种情况首页尾页保留,倒数第二个页面为..., 页码从头往后算

第二种情况:当前页码处于最后5个的时候

如图:

用Vue写一个分页器的示例代码

首页和尾页依然保留,第二个页码为...,页码从最后向前算

第三种情况:页面处于较中间位置的时候

如图:

用Vue写一个分页器的示例代码

首页和尾页都保留,第二个页码和倒数第二个页码都为 ... ,同时页面从当前页码位置向两侧算

三、用代码来实现上面的三种情况

从上面的思路来看,页码具体如何呈现由当前页码的位置决定,所以我们要在data里设置一个currentPage:1,而计算属性里用于渲染页码的pages通过currentPage来控制,同时还需要一个总页数totalPages:50。

先写第一种情况:

<script>
export default {
 data() {
  return {
   currentPage: 1,
   totalPages: 50
  }
 },
 computed: {
  pages() {
   const c = this.currentPage
   const t = this.totalPages
   if (c <= 5) {
    return [1, 2, 3, 4, 5, 6, 7, 8, 9, '...', t]
   }
  }
 }
};
</script>

效果如下:

用Vue写一个分页器的示例代码

写第二种情况,再加个if:

<script>
export default {
 data() {
  return {
   currentPage: 47,
   totalPages: 50
  }
 },
 computed: {
  pages() {
   const c = this.currentPage
   const t = this.totalPages
   if (c <= 5) {
    return [1, 2, 3, 4, 5, 6, 7, 8, 9, '...', t]
   } else if (c >= t - 4) {
    return [1, '...', t-8, t-7, t-6, t-5, t-4, t-3, t-2, t-1, t]
   }
  }
 }
};
</script>

把currentPage的值设为>= 46,效果如下:

用Vue写一个分页器的示例代码

把第三种情况加上:

computed: {
  pages() {
   const c = this.currentPage
   const t = this.totalPages
   if (c <= 5) {
    return [1, 2, 3, 4, 5, 6, 7, 8, 9, '...', t] //第一种情况
   } else if (c >= t - 4) {
    return [1, '...', t-8, t-7, t-6, t-5, t-4, t-3, t-2, t-1, t] //第二种情况
   } else {
    return [1, '...', c-3, c-2, c-1, c, c+1, c+2, c+3, '...', t] //第三种情况
   }
  }
 }

基本就是这样,已经可以通过改变currentPage的值查看分页器的变化了。

接下来实现点击相应的页码来改变currentPage的值,只要写一个点击事件再写一个函数就好了。

<li class="page" 
  v-for="(item, index) in pages" 
  :key="index"
  :class="{actived: item === currentPage}"  // 给点击到的当前页码添加样式
  @click="select(item)"   // 添加一个点击事件
>

...

methods: {
  select(item) {
    this.currentPage = item
  }
}

...

actived: {
  border-color: #2d8cf0;
  background-color: #2d8cf0;
  color: #fff;
}

效果如下:

用Vue写一个分页器的示例代码

为了让当前页码更清楚,再在页面上加上当前多少页

<div>当前第{{currentPage}}页</div>

效果如下:

用Vue写一个分页器的示例代码

发现了一bug,就是我们每次点击的时候,都是将item的具体内容传递过去改变currentIPage的,但是当我们点的 ... 的时候就把它也传递过去了,但是它不是我们要的页码的数据,在计算的时候就出错了,所以我们需要做一点处理。同时,还有再点击当前页码的时候也不必再执行select函数了。

简单改写一下select函数:

select(n) {
  if (n === this.currentPage) return 
  if (typeof n === 'string') return 
  this.currentPage = n
}

这样就正常了。

再把两侧icon向前一页和向后一页的功能加上,因为一个是加1一个是减1,所以写一个函数传递不同的参数就行了。

<li class="page" @click="prevOrNext(-1)"><span class="fa fa-chevron-left" aria-hidden="true"></span></li>

...

<li class="page" @click="prevOrNext(1)"><span class="fa fa-chevron-right" aria-hidden="true"></span></li>

...

prevOrNext(n) {
  this.currentPage += n
}

效果如下:

用Vue写一个分页器的示例代码

呃,边界问题,当currentPage为1时就不能再减了,当它为最大时也不能再加了。

改写一下代码:

prevOrNext (n) {
 this.currentPage += n
 this.currentPage < 1
 ? this.currentPage = 1
 : this.currentPage > this.totalPages
  ? this.currentPage = this.totalPages
  : null
}

这下就可以了,如图:

用Vue写一个分页器的示例代码

四、 结语

写到这里,这个分页器基本功能就写完了,当然,我们还可以继续封装,在每次改变currentPage的时候用this.$emit通知外面实现通信,还可以通过props来向内传递数据,比如传递totalPages等,这些都是可以继续完善的内容。最重要的一点,关于分页器的具体计算方法,我用的是最笨的方法,所以同志们要是知道更好的办法记得留言啊~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery学习笔记之jQuery选择器的使用
Dec 22 Javascript
打造基于jQuery的高性能TreeView(asp.net)
Feb 23 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
Apr 12 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 Javascript
利用jquery给指定的table动态添加一行、删除一行的方法
Oct 12 Javascript
js 输入框 正则表达式(菜鸟必看教程)
Feb 19 Javascript
详解react-router如何实现按需加载
Jun 15 Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
Dec 09 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
Sep 29 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
Sep 05 Javascript
vue-cli3.0 特性解读
Apr 22 #Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 #Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
Apr 22 #Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 #Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
Apr 22 #Javascript
jQuery中图片展示插件highslide.js的简单dom
Apr 22 #jQuery
手写简单的jQuery雪花飘落效果实例
Apr 22 #jQuery
You might like
php 文本文件的读取效率
2012/02/10 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
php生成扇形比例图实例
2013/11/06 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
js操作模态窗口及父子窗口间相互传值示例
2014/06/09 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
Python文件读写常见用法总结
2019/02/22 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
Python 如何实现访问者模式
2020/07/28 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
女生节标语
2014/06/26 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
教师求职自荐信
2015/03/26 职场文书
土建技术员岗位职责
2015/04/11 职场文书
python文件目录操作之os模块
2021/05/08 Python
教你用python控制安卓手机
2021/05/13 Python
MySQL一劳永逸永久支持输入中文的方法实例
2022/08/05 MySQL