100行代码实现一个vue分页组功能


Posted in Javascript onNovember 06, 2018

今天用vue来实现一个分页组件,总体来说,vue实现比较简单,样式部分模仿了elementUI。所有代码的源码可以再github上下载的到:下载地址 先来看一下实现效果:

100行代码实现一个vue分页组功能

点击查看效果

整体思路

我们先看一下使用到的文件的目录:

100行代码实现一个vue分页组功能

我们在 pageComponentsTest.vue 页面引入了 pageComponent.vue 分页组件。整体思路是通过 props
来达到组件的灵活通用的效果,整体语法是使用vue的VM语法。

pageComponent.vue实现

首先实现一个分页,需要知道数据总条数,一个页面显示的数据条数和当前显示第几页的数据。那么我们在 pageComponent.vue 里面的 props 就有了。看下面的代码:

props: {
   // 分页配置
   pageConfig: {
    type: Object, require: true, default() {
     return {
      pageSize: 10,   //一页的数据条数
      pageNo: 0,    //当前页的索引
      total: 0,     //总的数据条数
      pageTotal: 0   //总的页数
     }
    }
   }

根据用户入参,我们可以使用计算属性来计算一个总页数的变量:

computed: {
   //计算总页数,如果传了pageTotal,直接取pageTotal的值,如果传了total,那么根据pageSize去计算
   pageTotal(){
    const config = this.pageConfig
    if(config.pageTotal){
     return config.pageTotal
    }else {
     if(config.pageSize && config.total){
      return Math.ceil(config.total/config.pageSize)
     }else {
      return 0
     }
    }
   }
  }

有了总页数,和当前页,就需要各种判断来实现我们的html部分了,这里分4中情况

  1. 总页数小于8,只需要直接遍历到8就行了。
  2. 总页数大于8,但当前页小于4的。
  3. 总页数大于8,当前页靠后的。
  4. 总页数大于8,当前页在中间的。

下面看具体的实现:

<!--上一页-->
   <button @click="prePage" :disabled="currentPage === 1">上一页</button>
   <!--总页数小于8的-->
   <template v-if="pageTotal <= showPageNo">
    <button v-for="i in pageTotal" @click="changeCurrentPage(i)" :class="{active:i === currentPage}" :key="i">{{i}}</button>
   </template>
   <template v-else-if="currentPage < 4">
    <button v-for="i in 6" @click="changeCurrentPage(i)" :class="{active:i === currentPage}" :key="i">{{i}}</button>
    <button :disabled="true">···</button>
    <button>{{pageTotal}}</button>
   </template>
   <template v-else-if="currentPage > pageTotal - 4">
    <button>1</button>
    <button :disabled="true">···</button>
    <button v-for="i in 6" @click="changeCurrentPage(i + (pageTotal - 6))" :class="{active:(i + (pageTotal - 6)) === currentPage}" :key="i">{{i + (pageTotal - 6)}}</button>
   </template>
   <template v-else>
    <button>1</button>
    <button :disabled="true">···</button>
    <button @click="changeCurrentPage(currentPage - 2)">{{currentPage - 2}}</button>
    <button @click="changeCurrentPage(currentPage - 1)">{{currentPage - 1}}</button>
    <button class="active">{{currentPage}}</button>
    <button @click="changeCurrentPage(currentPage + 1)">{{currentPage + 1}}</button>
    <button @click="changeCurrentPage(currentPage + 2)">{{currentPage + 2}}</button>
    <button :disabled="true">···</button>
    <button @click="changeCurrentPage(pageTotal)">{{pageTotal}}</button>
   </template>
   <!--下一页-->
   <button @click="nextPage" :disabled="currentPage === pageTotal">下一页</button>

可以看到页面上需要实现3个方法,分别是上下页,和点击页面的方法。

methods: {
   prePage(){
    this.currentPage -= 1
    this.$emit('changeCurrentPage',this.currentPage)
   },
   nextPage(){
    this.currentPage += 1
    this.$emit('changeCurrentPage',this.currentPage)
   },
   changeCurrentPage(i){
    this.currentPage = i
    this.$emit('changeCurrentPage',this.currentPage)
   }
  }

以上就是 pageComponent.vue 的大致实现了,每次页面改变,都会触发一个 changeCurrentPage 方法的回调,用来通知当前使用组件的页面当前页已经改变。

pageComponentsTest.vue的实现

引用页面就比较简单了,只要传入组件需要的对应的参数,就能显示我们的组件了。 引用部分:

<template>
 <div class="pageComponentsTest">
  <page-component :page-config="pageConfigTotal" @changeCurrentPage="changePage"></page-component>
  <page-component :page-config="pageConfigPageTotal"></page-component>
 </div>
</template>

配合入参部分:

{
  name: "pageComponentsTest",
  data() {
   return {
    pageConfigTotal:{total:21,pageSize:10,pageNo:1},
    pageConfigPageTotal:{total:21,pageSize:10,pageNo:1,pageTotal:50}
   }
  },
  components:{'page-component':pageComponent},
  methods: {
   changePage(page){
    this.pageConfigTotal.pageNo = page
   }
  }
 }

总结

可以看到使用vue实现分页组件整体来说是很容易了,比使用jQuery方便很多,使用vm模式开发前端的最明显的一个好处是,能是数据mode部分与view页面部分保持同步,而开发者不用考虑这个过程,所以整体来说简单了很多。

以上所述是小编给大家介绍的100行代码实现一个vue分页组功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Javascript公共脚本库系列(一): 弹出层脚本
Feb 24 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
May 07 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
Angular 常用指令实例总结整理
Dec 13 Javascript
微信小程序 表单Form实例详解(附源码)
Dec 22 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
Node.JS更改Windows注册表Regedit的方法小结
Aug 18 Javascript
vue组件name的作用小结
May 23 Javascript
vue中使用codemirror的实例详解
Nov 01 Javascript
node获取客户端ip功能简单示例
Aug 24 Javascript
ES6 解构赋值的原理及运用
May 25 Javascript
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
Oct 05 Javascript
微信小程序自定义tabBar组件开发详解
Sep 24 #Javascript
Vue递归实现树形菜单方法实例
Nov 06 #Javascript
electron中使用bootstrap的示例代码
Nov 06 #Javascript
vue实现自定义日期组件功能的实例代码
Nov 06 #Javascript
浅谈Vue数据响应思路之数组
Nov 06 #Javascript
Vue项目中最新用到的一些实用小技巧
Nov 06 #Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 #Javascript
You might like
一段php加密解密的代码
2007/07/16 PHP
php支付宝接口用法分析
2015/01/04 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
2019/09/23 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
python paramiko实现ssh远程访问的方法
2013/12/03 Python
解析Python中的异常处理
2015/04/28 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
Python中字典和集合学习小结
2017/07/07 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
python适合做数据挖掘吗
2020/06/16 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
实习期自我鉴定
2013/10/11 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
幼师自我鉴定
2014/02/01 职场文书
趣味活动策划方案
2014/02/08 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
80后职场人的职业生涯规划
2014/03/08 职场文书
工程安全员岗位职责
2014/03/09 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
环保公益广告语
2014/03/13 职场文书
材料员岗位职责
2014/03/13 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
2014个人年度工作总结
2014/12/15 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server