最近写了一个分页组件,效果如下图:

f-pagination.js文件

Vue.component('f-pagination',{
template:'<div class="fPage" v-if="showPagination">\n' +
' <ul>\n' +
' <li class="sumData">\n' +
' <span>共</span>' +
' <span>{{sumData}}</span>' +
' <span>条</span>\n' +
' </li>\n' +
' <li class="prevPage" :class="{disabled:!prevDisabled}">\n' +
' <a @click="prevText">{{clickText.prevText}}</a>\n' +
' </li>\n' +
' <li class="pageNum" v-for="item in pageSum">\n' +
' <a @click="itemclick(item)" :class="{active:item.active}">{{item.text}}</a>\n' +
' </li>\n' +
' <li class="nextPage" :class="{disabled:!nextDisabled}">\n' +
' <a @click="nextText">{{clickText.nextText}}</a>\n' +
' </li>\n' +
' <li class="showPageNum" v-if="showPageNum">\n' +
' <select v-model="currentperPageNum" @change="changePerPageNum">\n' +
' <option v-for="item in perPageNum" :value="item">' +
' <span>{{item}}<span>' +
' <span>条/页</span>' +
' </option>\n' +
' </select>\n' +
' </li>\n' +
' <li class="selectPageNum" v-if="skipPage">\n' +
' <span>跳至</span>\n' +
' <input type="text" v-model="skipPageNum" @keyup.13="skipPageclick">\n' +
' <span>页</span>\n' +
' </li>\n' +
' </ul>\n' +
' </div>',
props:{
pageNum:{ //总页数
type:Number,
default:0
},
sumData:{ //总数据
type:Number,
default:0
},
clickText:{
type:Object,
default:function(){
return {
prevText:"上一页",
nextText:"下一页"
}
}
},
perPageNum:{ //每页显示多少条
type:Array,
default:function(){
return [100,200,300,400]
}
},
options:{
type:Object,
default:function(){
return {
pageRows:'1',
visibleCount:5,
limitNum:true, //是否显示每页多少条
skipPage:true
}
}
}
},
data:function(){
return{
pageSum:[],//页数数据
currentPage: 1,
prevDisabled: true, //上一页
nextDisabled: false, //下一页
skipPageNum:1,
currentperPageNum:'' //每页显示多少条数据
}
},
computed:{
showPagination:function(){ //总页数大于1时才显示分页
if(this.pageNum == 0 || this.pageNum == 1){
return false;
}else{
return true;
}
},
pageCount:function(){ //显示的页数
if(this.pageNum >= this.options.visibleCount){
return this.options.visibleCount;
}else{
return this.pageNum;
}
},
showPageNum:function(){
return this.options.limitNum;
},
skipPage:function(){
return this.options.skipPage;
}
},
methods:{
initData:function(){ //页面初始化
if(!this.pageCount) return false;
this.pageSum = [];
this.currentPage = 1;
for(var i = 0; i < this.pageCount; i++){
this.pageSum.push({
text: i+1,
active: false
});
}
this.pageSum[0].active = true;
this.prevDisabled = false;
this.nextDisabled = true;
this.skipPageNum = this. pageNum;
},
itemclick:function(item){ //点击页
if(this.currentPage != item.text){
this.currentPage = item.text;
this.calcItem();
}
},
prevText:function(){ //上一页
if(this.prevDisabled){
this.currentPage-=1;
this.calcItem();
}
},
nextText:function(){ //下一页
if(this.nextDisabled){
this.currentPage+=1;
this.calcItem();
}
},
calcItem:function(){
if(this.pageCount < this.options.visibleCount){
this.resetStyle();
this.pageSum[this.currentPage-1].active = true
//计算上一页,下一页的显示
if(this.currentPage == 1){
this.prevDisabled = false;
this.nextDisabled = true;
}else if(this.currentPage == this.pageCount){
this.prevDisabled = true;
this.nextDisabled = false;
}else{
this.prevDisabled = true;
this.nextDisabled = true;
}
} else {
var midNum = Math.ceil((this.pageCount)/2); //中间数
if(this.pageCount % 2 == 0){ //如果是偶数中间数加1
midNum += 1;
}
var midPage = this.pageNum - (this.pageCount - midNum);//最后一页在中间的页码
if(this.currentPage <= midPage){ //当前页在最后一页前
this.resetStyle();
if(this.currentPage <= midNum){ //当前点击的页数小于当前的中间页
this.pageSum[this.currentPage-1].active = true;
var starNum = 0;
for(var i = 0; i < this.pageCount; i++){
this.pageSum[i].text = starNum + i + 1;
}
} else { //当前点击的页数大于当前的中间页
var starNum = this.currentPage - midNum;
for(var i = 0;i < this.pageCount; i++){
this.pageSum[i].text = starNum + i + 1;
}
this.pageSum[midNum-1].active = true;
}
//计算上一页的显示,下一页始终显示
if(this.currentPage == 1){
this.prevDisabled = false;
}else {
this.prevDisabled = true;
}
this.nextDisabled = true;
} else { //如果当前到最后页
var starNum = this.pageNum - this.pageCount +1;
for(var i = 0;i < this.pageCount; i++){
this.pageSum[i].text = starNum + i;
}
this.resetStyle();
var index = this.pageNum - this.currentPage;
this.pageSum[this.pageCount - index - 1].active = true;
//计算下一页的显示,上一页始终显示
if(this.currentPage == this.pageNum){
this.nextDisabled = false;
}else {
this.nextDisabled = true;
}
this.prevDisabled = true;
}
}
},
resetStyle:function(){
for(var i = 0; i < this.pageCount; i++){
this.pageSum[i].active = false;
}
},
skipPageclick:function(){
if(this.skipPageNum>=1 && this.skipPageNum<= this.pageNum){
this.currentPage = parseInt(this.skipPageNum);
}else if(this.skipPageNum>this.pageNum){
this.currentPage = parseInt(this.pageNum);
}else{
this.currentPage = 1;
}
this.calcItem();
this.skipPageNum ='';
},
changePerPageNum:function(){
console.log(this.currentperPageNum);
}
},
created:function(){
this.initData();
} });

f-pagination.css文件

ul,li,span,input,select{
margin:0;
padding:0;
}
ul{
list-style: none;
}
li{
float:left;
margin-right:10px;
font-size:14px;
}
a{
text-decoration: none;
color:black;
}
.fPage{
margin:100px 200px;
}
.fPage ul>li>a{
border:1px solid #C3C9D3;
text-align:center;
color: #656565;
padding: 6px 12px;
}
.pageNum .active{
background-color: #1B6FEC;
color:white;
}
.fPage .showPageNum>select{
padding: 6px 10px;
margin-top:-6px;
}
.fPage .selectPageNum{
margin-top:-5px;
}
.fPage .selectPageNum>input{
width:20px;
padding: 5px 8px;
}
.disabled{
outline:0 none;
cursor:default;
opacity: 0.4;
/*filer:alpha(opacity=40);*/
pointer-events: none;
}

index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="f-pagination.css">
<script src="vue.js"></script>
<script src="f-pagination.js"></script>
</head>
<body>
<div id="app">
<f-pagination
:page-num="pageNum"
:options="tabDataPagination.userOptions"
:sum-data = "tabDataPagination.rowCount"
></f-pagination>
</div> </body>
<script>
var vm = new Vue({
el:"#app",
data:{
pageNum:12, //总页数
tabDataPagination: {
count: 0,
rowCount: 300,
userOptions: {
visibleCount: 8,
limitNum:true,
skipPage:true
}
}
}
})
</script>
</html>

Vue 2.0 pagination分页组件的更多相关文章

  1. 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件

    DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...

  2. vue2.0实现分页组件

    最近使用vue2.0重构项目, 需要实现一个分页的表格, 没有找到合适的组件, 就自己写了一个, 效果如下: 该项目是使用 vue-cli搭建的, 如果你的项目中没有使用webpack,请根据代码自己 ...

  3. 基于vue2.0的分页组件开发

    今天安排的任务是写基于vue2.0的分页组件,好吧,我一开始是觉得超级简单的,但是越写越写不出来,写的最后乱七八糟的都不知道下句该写什么了,所以重新捋了思路,小结一下- 首先写组件需要考虑: 要从父组 ...

  4. 第二百零九节,jQuery EasyUI,Pagination(分页)组件

    jQuery EasyUI,Pagination(分页)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Pagination(分页)组件的使 ...

  5. Vue 2.0 右键菜单组件 Vue Context Menu

    Vue 2.0 右键菜单组件 Vue Context Menu https://juejin.im/entry/5976d14751882507db6e839c

  6. vue修改elementUI的分页组件视图没更新问题

    转: vue修改elementUI的分页组件视图没更新问题 今天遇到一个小问题平时没留意,el-pagination这个分页组件有一个属性是current-page当前页.今天想在methods里面手 ...

  7. 基于Vue的简单通用分页组件

    分页组件是每一个系统里必不可少的一个组件,分页组件分为两部分.第一部分是模版部分,用于显示当前分页组件的状态,例如正在获取数据.没有数据.没有下一页等等:第二部分是分页数据对象,用于封装一个分页组件的 ...

  8. vuejs2.0实现分页组件,使用$emit进行事件监听数据传递

    上一篇文章介绍了vuejs实现的简单分页,如果我有几个页面都需要有分页效果,不可能每个页面都去复制一下这段代码吧,意思是封装一下,变成通用的组件. 首先使用基础 Vue 构造器,创建一个“子类”,Vu ...

  9. Vue+element UI实现分页组件

    介绍 这是一个是基于element-UI的分页组件基础上,进行了二次封装的分页组件,在展示数据时,该分页组件采用了每显示一页数据,只请求当前页面的数据的请求策略,从而避免了一次性将数据全部请求所造成的 ...

随机推荐

  1. class字节码结构(零:补充:class结构,常量池,字节码指令)

    JVM高级特性与实践(五):实例探究Class类文件 及 常量池 JVM高级特性与实践(六):Class类文件的结构(访问标志,索引.字段表.方法表.属性表集合) JVM高级特性与实践(七):九大类字 ...

  2. python3 内置函数详解

    内置函数详解 abs(x) 返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小. # 如果参数是复数,则返回其大小. >>> abs(-25) 25 >&g ...

  3. P1484 种树

    P1484 种树 题意: 在n个数中选出至多k个数,且两两不相邻,并使所选数的和最大. n<=500000  思路 先建一个堆,把所有点扔进去,当取出队首元素时累加到答案时,把它和它左右两个点一 ...

  4. 原生ajax封装,包含post、method方式

    原生ajax封装,包含post.method方式 function ajax(method, url, data, success) { var xhr = null; try { xhr = new ...

  5. Hive执行过程

    http://blog.csdn.net/wf1982/article/details/9122543

  6. (转)支持Multi Range Read索引优化

    支持Multi Range Read索引优化 原文:http://book.51cto.com/art/201701/529465.htm http://book.51cto.com/art/2016 ...

  7. sql server 2012 数据库日志文件过大,怎么缩小?

    最近发现网站不能访问,原因数据库服务器磁盘剩余空间没了.再细查发现日志文件占用了70%,收缩日志文件失败. 在网上查找原因,是没有备份不能收缩日志文件. 临时解决的方式: 备份事务日志,再收缩日志文件 ...

  8. eclipse 首次使用配置

      这里是eclipse neo版本的配置  1.设置workspace 首次启动,选择指定的工作空间(workspace),用于存放java代码.

  9. 【树】Count Complete Tree Nodes

    题目: 求完全二叉树节点数. 思路: 满二叉树的节点数是2^k-1,k是树的深度. 所以我们可以先判断该树是否为满二叉树,然后是的话直接返回结果,如果不是递归地求解子树. 这样不用遍历所有的节点.复杂 ...

  10. 【数组】Maximum Subarray

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...