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

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. 匹配img标签的正则表达式

    $preg = '/<img.*?src=[\"|\']?(.*?)[\"|\']?\s.*?>/i';//匹配img标签的正则表达式 preg_match_all($ ...

  2. Dynamic Type

    啥是 Dynamic Type 动态字体,即视力不好的用户,调整了默认字体的大小,开发者应该根据这个设置,动态改变界面的字体等,保证用户能看得清楚. 这个还是蛮重要的,视力不好的人越来越多. 用户在哪 ...

  3. layer_mobile的简单使用

    layer mobile弹层组件是为移动设备(手机.平板等webkit内核浏览器/webview)量身定做的弹层UI. 由于是采用原生 JavaScript编写,所以并不依赖任何第三方库. layer ...

  4. OS之进程管理---孤儿进程和僵尸进程

    僵尸进程 当一个进程终止时,操作系统会释放其资源,不过它位于进程表中的条目还是在的,直到它的父进程调用wait():这是因为进程表中包含了进程的退出状态.当进程已经终止,但是其父进尚未调用wait() ...

  5. UIScrollView之isTracking delaysContentTouches canCancelContentTouches

    UIScrollView有一个BOOL类型的tracking属性,用来返回用户是否已经触及内容并打算开始滚动,我们从这个属性开始探究UIScrollView的工作原理: 当手指触摸到UIScrollV ...

  6. Vim实用技巧系列 - 搜索

    最近发现了一个很好的VIM资源,best of vim tips, 展示了一系列很有用的vim 技巧.博主会逐个翻译介绍这些技巧. 来源: http://rayninfo.co.uk/vimtips. ...

  7. 理解HashMap的原理

    HashMap内部数据结构        HashMap内部采用数组和链表结合的方式来存取数据(见下图).这种方式有什么好处呢? 我们知道,数组操作对于检索是O(1)的,能够很快的根据数组的下标定位对 ...

  8. vba调用c#dll

    本文阐述如何用C#创建COM组件,并能用VB6.0等调用.附有完整测试通过的代码.该功能总体看来很简单,实际值得注意的地方还是挺多.因为很少有人写这类文章,有些代码也是转来转去的不全,有些甚至让人误入 ...

  9. MySql登陆密码忘记-解决方案

    方法一:MySQL提供跳过访问控制的命令行参数,通过在命令行以此命令启动MySQL服务器: safe_mysqld --skip-grant-tables& 即可跳过MySQL的访问控制,任何 ...

  10. org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="hadoop": hadoop:supergroup:rwxr-xr-x

    这时windows远程调试hadoop集群出现的这里 做个记录   我用改变系统变量的方法 修正了错误 网上搜索出来大概有三种: 1.在系统的环境变量或java JVM变量里面添加HADOOP_USE ...