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技术技巧大全(五)
Jan 22 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
Aug 14 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
Sep 26 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
May 26 Javascript
JavaScript和CSS通过expression实现Table居中显示
Jun 28 Javascript
JS对img标签进行优化使用onerror显示默认图像
Apr 24 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
bootstrap制作jsp页面(根据值让table显示选中)
Jan 05 Javascript
vue router 跳转后回到顶部的实例
Aug 31 Javascript
详解react native页面间传递数据的几种方式
Nov 07 Javascript
基于Layui自定义模块的使用方法详解
Sep 14 Javascript
jQuery实现飞机大战小游戏
Jul 05 jQuery
纯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
Laravel 5 框架入门(三)
2015/04/09 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
Javascript 学习书 推荐
2009/06/13 Javascript
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
jQuery javascript获得网页的高度与宽度的实现代码
2016/04/26 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue 实现 ios 原生picker 效果及实现思路解析
2017/12/06 Javascript
深入理解ES6之数据解构的用法
2018/01/13 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
浅析Python 中整型对象存储的位置
2016/05/16 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
python如何从文件读取数据及解析
2019/09/19 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
python不同版本的_new_不同点总结
2020/12/09 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
百联网上商城:i百联
2017/01/28 全球购物
北京SQL新华信咨询
2016/09/30 面试题
宪法宣传周工作方案
2014/05/26 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
教你用python实现12306余票查询
2021/06/30 Python
Elasticsearch 基本查询和组合查询
2022/04/19 Python