vue2.0实现分页组件的实例代码


Posted in Javascript onJune 22, 2017

最近使用vue2.0重构项目, 需要实现一个分页的表格, 没有找到合适的分页组件, 就自己写了一个, 效果如下:

vue2.0实现分页组件的实例代码

该项目是使用 vue-cli搭建的, 如果你的项目中没有使用webpack,请根据代码自己调整:

首先新建pagination.vue文件, 所有组件的代码都写在这里, 写这样的组件并没有什么太大的难度, 主要是解决父子组件之间值传递的问题

<template>
 <nav>
  <ul class="pagination">
   <li :class="{'disabled': current == 1}"><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="setCurrent(current - 1)"> « </a></li>
   <li :class="{'disabled': current == 1}"><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="setCurrent(1)"> 首页 </a></li>
   <li v-for="p in grouplist" :class="{'active': current == p.val}"><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" 
                                     @click="setCurrent(p.val)"> {{ p.text }} </a>
   </li>
   <li :class="{'disabled': current == page}"><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="setCurrent(page)"> 尾页 </a></li>
   <li :class="{'disabled': current == page}"><a href="javascript:;" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="setCurrent(current + 1)"> »</a></li>
  </ul>
 </nav>
</template>
<script type="es6">
 export default{
  data(){
   return {
    current: this.currentPage
   }
  },
  props: {
   total: {// 数据总条数
    type: Number,
    default: 0
   },
   display: {// 每页显示条数
    type: Number,
    default: 10
   },
   currentPage: {// 当前页码
    type: Number,
    default: 1
   },
   pagegroup: {// 分页条数
    type: Number,
    default: 5,
    coerce: function (v) {
     v = v > 0 ? v : 5;
     return v % 2 === 1 ? v : v + 1;
    }
   }
  },
  computed: {
   page: function () { // 总页数
    return Math.ceil(this.total / this.display);
   },
   grouplist: function () { // 获取分页页码
    var len = this.page, temp = [], list = [], count = Math.floor(this.pagegroup / 2), center = this.current;
    if (len <= this.pagegroup) {
     while (len--) {
      temp.push({text: this.page - len, val: this.page - len});
     }
     ;
     return temp;
    }
    while (len--) {
     temp.push(this.page - len);
    }
    ;
    var idx = temp.indexOf(center);
    (idx < count) && ( center = center + count - idx);
    (this.current > this.page - count) && ( center = this.page - count);
    temp = temp.splice(center - count - 1, this.pagegroup);
    do {
     var t = temp.shift();
     list.push({
      text: t,
      val: t
     });
    } while (temp.length);
    if (this.page > this.pagegroup) {
     (this.current > count + 1) && list.unshift({text: '...', val: list[0].val - 1});
     (this.current < this.page - count) && list.push({text: '...', val: list[list.length - 1].val + 1});
    }
    return list;
   }
  },
  methods: {
   setCurrent: function (idx) {
    if (this.current != idx && idx > 0 && idx < this.page + 1) {
     this.current = idx;
     this.$emit('pagechange', this.current);
    }
   }
  }
 }
</script>
<style lang="less">
 .pagination {
  overflow: hidden;
  display: table;
  margin: 0 auto;
  /*width: 100%;*/
  height: 50px;
 li {
  float: left;
  height: 30px;
  border-radius: 5px;
  margin: 3px;
  color: #666;
 &
 :hover {
  background: #000;
 a {
  color: #fff;
 }
 }
 a {
  display: block;
  width: 30px;
  height: 30px;
  text-align: center;
  line-height: 30px;
  font-size: 12px;
  border-radius: 5px;
  text-decoration: none
 }
 }
 .active {
  background: #000;
 a {
  color: #fff;
 }
 }
 }
</style>

使用时, 在父组件中引入, 代码如下:

<template>
        <v-pagination :total="total" :current-page='current' @pagechange="pagechange"></v-pagination>
</template>
<script type="es6">
  import pagination from '@/components/common/pagination/pagination'
export default{
    data(){
 return {
        total: 150,     // 记录总条数
        display: 10,   // 每页显示条数
        current: 1,   // 当前的页数
},
 methods: {
     pagechange:function(currentPage){
       console.log(currentPage);
       // ajax请求, 向后台发送 currentPage, 来获取对应的数据
     }
   },
components: {
      'v-pagination': pagination,
    }
}
</script>

至此, 一个基于 vue2.0 的分页组件就完成了

Javascript 相关文章推荐
javascript一些不错的函数脚本代码
Sep 10 Javascript
Js组件的一些写法
Sep 10 Javascript
取得窗口大小 兼容所有浏览器的js代码
Aug 09 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
Nov 17 Javascript
浅谈Node.js:Buffer模块
Dec 05 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
利用原生js实现html5小游戏之打砖块(附源码)
Jan 03 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
Jul 03 jQuery
微信小程序制作表格的方法
Feb 14 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
May 18 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
纯JS实现只能输入数字的简单代码
Jun 21 #Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
Jun 21 #Javascript
Vue实现百度下拉提示搜索功能
Jun 21 #Javascript
vue2.0中click点击当前li实现动态切换class
Jun 21 #Javascript
jQuery实现可拖动进度条实例代码
Jun 21 #jQuery
详解Vue整合axios的实例代码
Jun 21 #Javascript
详解在vue-cli项目中安装node-sass
Jun 21 #Javascript
You might like
php实现水仙花数的4个示例分享
2014/04/08 PHP
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
JavaScript实现添加、查找、删除元素
2015/07/02 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
@ResponseBody 和 @RequestBody 注解的区别
2017/03/08 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
vue实现个人信息查看和密码修改功能
2018/05/06 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
python实现linux下抓包并存库功能
2018/07/18 Python
Python实现八皇后问题示例代码
2018/12/09 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
MYSQL支持事务吗
2013/08/09 面试题
大型晚会策划方案
2014/02/06 职场文书
党员党性分析材料
2014/02/17 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
个人自我鉴定总结
2014/03/25 职场文书
四风问题对照检查材料
2014/09/22 职场文书
个人委托书如何写
2014/09/25 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书