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

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. js创建对象方法

    1.对象字面量 let xys={ name:'xys', age:22, height:177 } console.log(xys.age)  //22   2.使用new操作符和构造函数    1 ...

  2. 微信小程序自定义弹窗wcPop插件|仿微信弹窗样式

    微信小程序自定义组件弹窗wcPop|小程序消息提示框|toast自定义模板弹窗 平时在开发小程序的时候,弹窗应用场景还是蛮广泛的,但是微信官方提供的弹窗比较有局限性,不能自定义修改.这个时候首先想到的 ...

  3. QuantLib 金融计算——基本组件之 Currency 类

    目录 QuantLib 金融计算--基本组件之 Currency 类 概述 构造函数 成员函数 如果未做特别说明,文中的程序都是 python3 代码. QuantLib 金融计算--基本组件之 Cu ...

  4. Openerp负载平衡

    来自OpenERP 7.0 带来了许多新特性,架构上也有许多改进.其中可配置 worker 参数,可使 OpenERP 运行在多进程模式,突破GIL的限制,有效利用了现代多核CPU的性能.但默认情况下 ...

  5. MVC的默认约定

    MVC项目中有很多默认约定,一种是对项目目录分配的约定,比如默认情况下需要将Javascript文件放置在Script文件夹中,但这并不妨碍你将这个文件夹重新命名,也可以将整个文件夹放置到任何想要放置 ...

  6. javascript数据基本类型和引用类型区别详解

    JavaScript基本数据类型: js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值. ...

  7. springboot设置静态资源不拦截的方法

    springboot设置静态资源不拦截的方法 springboot不拦截静态资源需配置如下的类: import org.springframework.context.annotation.Confi ...

  8. vs2013 with update2安装记录

    1.安装之后,提示update2无法安装2.按照以下方法进行修复,提示无法安装的项更多了(1项变3项了) http://jingyan.baidu.com/article/6d704a13f34d10 ...

  9. Android Studio修改字体大小

    android studio提供的主题是不能修改字体和字体大小的,如果要修改大小就的另存一份自定义的主题了. 1.启动Android Studio,菜单"File"-"S ...

  10. ZigBee 学习资源

    1.雪帕的主页 http://home.cnblogs.com/u/yqh2007/ 2.刘志鹏的主页 http://www.cnblogs.com/hustlzp/archive/2011/02/1 ...