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 相关文章推荐
Mootools 1.2教程 滚动条(Slider)
Sep 15 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
Aug 14 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
Oct 11 Javascript
table insertRow、deleteRow定义和用法总结
May 14 Javascript
js常用系统函数用法实例分析
Jan 12 Javascript
javascript去除字符串左右两端的空格
Feb 05 Javascript
javascript动态创建链接的方法
May 13 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
详解Javascript事件驱动编程
Jan 03 Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 Javascript
vue做网页开场视频的实例代码
Oct 20 Javascript
layer.alert回调函数执行关闭弹窗的实例
Sep 11 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获取后台Job管理的实现代码
2011/06/10 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
JavaScript中setInterval的用法总结
2013/11/20 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
微信域名检测接口调用演示步骤(含PHP、Python)
2019/12/08 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
教你学会使用Python正则表达式
2017/09/07 Python
Python读取实时数据流示例
2019/12/02 Python
深入了解NumPy 高级索引
2020/07/24 Python
python中_del_还原数据的方法
2020/12/09 Python
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
群众路线批评与自我批评
2014/02/06 职场文书
教堂婚礼主持词
2014/03/14 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
党员批评与自我批评
2014/10/15 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android