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 相关文章推荐
html向js方法传递参数具体实现
Aug 08 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
May 03 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
Aug 24 Javascript
Vue分页组件实例代码
Apr 17 Javascript
Vue.js中兄弟组件之间互相传值实例
Jun 01 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 Javascript
利用nvm管理多个版本的node.js与npm详解
Nov 02 Javascript
layui 监听表格复选框选中值的方法
Aug 15 Javascript
vue中使用gojs/jointjs的示例代码
Aug 24 Javascript
微信小程序实现蒙版弹窗效果
Nov 01 Javascript
JS实现选项卡效果的代码实例
May 20 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
Sep 12 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 - Html Transfer Code
2006/10/09 PHP
php的正则处理函数总结分析
2008/06/20 PHP
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
Python实现全局变量的两个解决方法
2014/07/03 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
python简易远程控制单线程版
2018/06/20 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
python构造IP报文实例
2020/05/05 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
幼儿园教师国培感言
2014/02/02 职场文书
转预备党员政审材料
2014/02/06 职场文书
公司中秋节活动方案
2014/02/12 职场文书
小学生学习感言
2014/03/10 职场文书
干部作风整顿个人剖析材料
2014/10/06 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2016年五一促销广告语
2016/01/28 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
MySql数据库触发器使用教程
2022/06/01 MySQL