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 相关文章推荐
Js获取事件对象代码
Aug 05 Javascript
简单几行JS Code实现IE邮件转发新浪微博
Jul 03 Javascript
javascript事件函数中获得事件源的两种不错方法
Mar 17 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
May 23 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
Dec 04 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
Dec 25 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
Mar 03 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
Jul 19 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 Javascript
详解vuex 渐进式教程实例代码
Nov 27 Javascript
Vue CLI3中使用compass normalize的方法
May 30 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
提问的智慧
2006/10/09 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
javascript 命名规则 变量命名规则
2010/02/25 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
js实现图片在未加载完成前显示加载中字样
2014/09/03 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
Python3学习笔记之列表方法示例详解
2017/10/06 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Python 3.8 新功能全解
2019/07/25 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
大学生优秀班干部事迹材料
2014/05/26 职场文书
保护环境标语
2014/06/09 职场文书
低碳环保标语
2014/06/12 职场文书
简历自荐信范文
2015/03/09 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL