用vue写一个分页器代码
分页是项目中常会用到的,网上的插件也很多,但是有些功能太齐全反而不是必要的,所以抽时间自己写了一下(小白写代码,若发现问题还请及时赐教,感激不尽……)
如图,想要一个这样的页码:
a. 上一页、下一页固定展示
b. 第一页、最后一页固定展示
c. 中间,即:左右...之间需要展示的页码个数可自定义
d. 可任意选择页面展示数据条数
一、不需要展示
,只展示页码,需要定义3个变量:pageNum(当前页码)、totalNum(总页码)、middleSize(中间,即左右...之间需要展示的页码 个数)
1、totalNum <= middleSize+2时,只显示1,2,3,4没有...,(为什么是totalNum <= middleSize+2,而不是totalNum <= middleSize,这是因为第一个、最后一页是固定展示的),totalNum=7,middleSize=5,展示情况如下图:

2、pageNum <= middleSize时,右侧...显示,totalNum=8,middleSize=5,展示情况如下图:

3、pageNum >= totalNum - ( middleSize - 1 )时,左侧...显示,totalNum=100, middleSize=5,展示情况如下图:

4、除以上3种情况,左右两侧...都展示,那中间页码如何展示,代码如下:
// ④ 展示左右两侧的'...'
let pages = [1, '...'];
// 当左右两侧的...都展示时,中间的页码该如何展示呢?其实就是 当前页码 - (中间要展示页码的个数/2向下取整) 到 当前页码 + (中间要展示页码的个数/2向下取整)即可
const half = Math.floor(this.middleSize/2); // 向下取整
for(let i=this.pageNum-half; i<=this.pageNum+half; i++) {
pages.push(i);
}
pages.push('...');
pages.push(this.totalNum);
return pages;
二、左侧页面展示条数代码实现较简单,可查看全部代码:
<template>
<div class="pageContainer">
<!-- 当前页面展示多少条数据 -->
<div class="pageSizeInner">
<div class="totalCount">共 {{totalCount}} 条</div>
<div class="pageSize">
<select v-model="perPageCount" @change="changePerPageCount">
<option :value="item" v-for="(item, index) in page_size" :key="index">{{item}}</option>
</select>
</div>
</div> <!-- 页码部分 -->
<ul class="pagesInner">
<!-- 上一页 -->
<li class="page" :class="{noClick : pageNum == 1}" @click="preOrNext(-1)">
<span>上一页</span>
</li>
<!-- 页码 -->
<li class="page" :class="{actived : item === pageNum}" v-for="(item, index) in displayPages" :key="index" @click="select(item)">
<span>{{item}}</span>
</li>
<!-- 下一页 -->
<li class="page" :class="{noClick : pageNum == totalNum}" @click="preOrNext(1)">
<span>下一页</span>
</li>
</ul>
</div>
</template> <script>
export default {
data() {
return {
totalCount: 9999, // 总共多少条数据
page_size: ['100条/页', '200条/页', '300条/页', '400条/页'], // 每页展示多少条数据
pageNum: 1, // 当前页码
totalNum: 20, // 总页码
middleSize: 5, // 中间显示几个页码
perPageCount: 0, // 每页展示多少条数据
}
},
computed: {
// 展示页码
displayPages() {
// ① 只展示'上一页'、'页码'、'下一页'
if(this.totalNum <= this.middleSize + 2) {
let pages = [];
for(let i=1; i<=this.totalNum; i++) {
pages.push(i);
}
return pages;
}else if(this.pageNum <= this.middleSize) { // this.pageNum <= this.middleSize+2
// ② 只展示右侧'...',只要当前页码小于或者等于要展示的中间页码时就展示
let pages = [1];
for(let i=2; i<this.middleSize+1; i++) {
pages.push(i);
}
pages.push('...');
pages.push(this.totalNum);
return pages;
}else if(this.pageNum >= this.totalNum - (this.middleSize - 1)) {
// ③ 只展示左侧'...',主要当前页码 大于或等于 总页码-(中间要展示页码的个数 - 1)就展示
let pages = [1, '...'];
for(let i=this.totalNum-this.middleSize+1; i<=this.totalNum; i++) {
pages.push(i);
}
return pages;
}else {
// ④ 展示左右两侧的'...'
let pages = [1, '...'];
// 当左右两侧的...都展示时,中间的页码该如何展示呢?其实就是 当前页码 - (中间要展示页码的个数/2向下取整) 到 当前页码 + (中间要展示页码的个数/2向下取整)即可
const half = Math.floor(this.middleSize/2); // 向下取整
for(let i=this.pageNum-half; i<=this.pageNum+half; i++) {
pages.push(i);
}
pages.push('...');
pages.push(this.totalNum);
return pages;
}
}
},
mounted() {
// 每页展示多少条数据
this.perPageCount = this.page_size[0];
// 计算总页码是多少
this.totalNum = Math.ceil(this.totalCount/parseInt(this.perPageCount));
},
methods: {
// 点击'上一页'、'下一页'
preOrNext(n) {
this.pageNum = this.pageNum + n;
this.pageNum <= 1 ? this.pageNum = 1 : this.pageNum > this.totalNum ? this.pageNum = this.totalNum : null;
// 作为子组件,当前页码发生改变时需要通知父组件
// this.$emit('pageNumChanged', this.pageNum);
},
// 点击'页码'
select(item) {
if(typeof item === 'string') return;
if(item == this.pageNum) return;
this.pageNum = item;
// 作为子组件,当前页码发生改变时需要通知父组件
// this.$emit('pageNumChanged', this.pageNum);
},
// 选择页面展示条数,重新计算总页码
changePerPageCount() {
this.totalNum = Math.ceil(this.totalCount/parseInt(this.perPageCount));
}
}
}
</script> <style lang="scss" type="text/css">
.pageContainer {
display: flex;
justify-content: space-between;
.pageSizeInner {
padding-top: 9px;
.totalCount {
display: inline-block;
margin-right: 5px;
}
.pageSize {
display: inline-block;
>select {
padding: 0 3px;
width: 100px;
height: 30px;
font-size: 12px;
border: 1px solid #eee;
border-radius: 2px;
box-sizing: border-box;
outline: none;
}
}
}
.pagesInner {
display: inline-block;
text-align: center;
font-size: 0;
li {
display: inline-block;
margin: 5px;
list-style: none;
>span {
display: block;
width: 46px;
height: 36px;
line-height: 36px;
text-align: center;
font-size: 12px;
border: 1px solid #eee;
border-radius: 5px;
cursor: pointer;
}
&.noClick {
>span {
cursor: no-drop;
// border-color: transparent;
}
}
&.actived {
>span {
border-color: #2d8cf0;
background-color: #2d8cf0;
color: #fff;
}
}
}
}
}
</style>
(注:记住一个原则就可实现分页,右点左侧页码个数 = middleSize, 左点右侧页码个数 = middleSize,totalNum<=middleSize+2无点只有页码,除以上三种情况外左右两侧...都展示)
用vue写一个分页器代码的更多相关文章
- 用ES6的class模仿Vue写一个双向绑定
原文地址:用ES6的class模仿Vue写一个双向绑定 点击在线尝试一下 最终效果如下: 构造器(constructor) 构造一个TinyVue对象,包含基本的el,data,methods cla ...
- 用vue写一个仿简书的轮播图
原文地址:用vue写一个仿简书的轮播图 先展示最终效果: Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果.写好css样式,只需改变每张图片的class即可实现轮 ...
- 用vue写一个仿app下拉刷新的组件
如果你用vue弄移动端的页面,那么下拉刷新还是比较常见的场景,下面来研究如何写一个下拉刷新的组件(先上图); 由于节省大家的时间,样式就不贴出来了. html结构也不必介绍了,直接看代码吧-.- &l ...
- 使用Vue写一个九九乘法表
Vue.js是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. 下面是在Vue 测试实例 - 菜鸟教程(runoob.com)使用Vue写的一个九九乘法表, ...
- [Vue]写一个简单的文件上传控件
这篇将介绍如何写一个简单的基于Vue+Element的文件上传控件. 控件将具有 1. 上传队列的列表,显示文件名称,大小等信息,可以显示上传进度实时刷新 2. 取消上传 使用Element的u ...
- 教你用Vue写一个开心消消乐
之前做过一个算法题,算法要求就是写一个开心消消乐的逻辑算法,当时也是考虑了一段时间才做出来.后来想了想,既然核心算法都有了,能不能实现一个开心消消乐的小游戏呢,于是花了两天时间做了一个小游戏出来. 效 ...
- Vue学习—Vue写一个图片轮播组件
1.先看效果: 熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播.我认为使用图片轮播. 第一可以给人以一种美观的感受,而不会显得网站那么呆板, 第二可以增加显示内容,同样的区域可以显示更多内 ...
- 使用Vue写一个登陆页面并在管理页面查看和修改
注册页面代码如下html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- vue 写一个炫酷的轮播图
效果如上图: 原理: 1.利用css 的 transform 和一些其他的属性,先选五张将图片位置拍列好,剩余的隐藏 2.利用 js 动态切换类名,达到切换效果 css代码如下 .swiper-cer ...
随机推荐
- 问题root@localhost's password:localhost:permission denied,please try again
转载:https://www.cnblogs.com/hmy-blog/p/6500909.html 经过试验,上述方法在我的电脑中没有成功. 1.安装 open ssh:sudo apt-get i ...
- 科大讯飞sdk语音合成工具类
注:主要是dll文件的配置 A:Java SDK 使用了 JNI 形式,在初始化 SDK 时,SDK 将加载共享库(Windows下为msc32.dll或msc64.dll文件,Linux下libms ...
- Python统计分析可视化库seaborn(相关性图,变量分布图,箱线图等等)
Visualization of seaborn seaborn[1]是一个建立在matplot之上,可用于制作丰富和非常具有吸引力统计图形的Python库.Seaborn库旨在将可视化作为探索和理 ...
- php7与其他版本共存
转自: https://zhangge.net/5088.html php7编译安装 https://zhangge.net/5075.html
- three.js 之 透明物体不能正常显示
这几天遇到一个需求,类似这个案例:http://www.hightopo.com/demo/FaultDetection/ 就是这个透明渐变呼吸光柱,看到之后就想着写个shader材质实现透明度渐变, ...
- 在java中有关于反射的皮毛----自己的简略认知
白首为功名.旧山松竹老,阻归程.欲将心事付瑶琴.知音少,弦断有谁听? 反射(reflection): 当我们在看到这个名词首先会想到的是,我们在上高中时学的物理,那么在java开发中,反射这个名词是怎 ...
- Java之属性和普通方法
一.定义类 上一节讲了很多深奥的理论,那么这节我们就得实践一下,先简单描述一下我们的实体世界:有一个学生小明,那么这个学生就是一个对象,这个对象有哪些属性和方法呢,我们可以先简单抽象一下,属性有(姓名 ...
- LCTF (easy-100)
先安装跑一下,不知道为啥我这里模拟器打不开,传到手机上就可以.如下图. 一个输入框,一个按钮,随便输入提示no. 放入JEB反编译. 可以看到有6个Class.大体看一遍,b和e应该和解题无关,在类a ...
- ZOJ Problem Set - 1008
1.翻译及思路 http://blog.csdn.net/dapengbusi/article/details/7313785 http://acm.sdut.edu.cn/bbs/read.php? ...
- (企业面试)描述Linux系统的启动过程?
1简单描述(口头): 1.开机BIOS自检(检查硬件,cpu,主板,内存……) 2. MBR引导 硬盘 0 柱面 0 磁道 1 扇区的前446byte 3. grub 引导菜单 cat/etc/gr ...