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 相关文章推荐
iis6+javascript Add an Extension File
Jun 13 Javascript
javascript整除实现代码
Nov 23 Javascript
js 数组去重的四种实用方法
Sep 09 Javascript
JS简单实现String转Date的方法
Mar 02 Javascript
JS基于正则表达式的替换操作(replace)用法示例
Apr 28 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
使用Vue.observable()进行状态管理的实例代码详解
May 26 Javascript
node将geojson转shp返回给前端的实现方法
May 29 Javascript
解决layui轮播图有数据不显示的情况
Sep 16 Javascript
javascript实现评分功能
Jun 24 Javascript
vue+axios 拦截器实现统一token的案例
Sep 11 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作为网站开发语言的原因分享
2012/01/03 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
php计算整个目录大小的方法
2015/06/01 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
js遍历获取表格内数据的方法(必看)
2017/04/06 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
Python删除windows垃圾文件的方法
2015/07/14 Python
python简单实现获取当前时间
2016/08/27 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
如何基于python测量代码运行时间
2019/12/25 Python
python实现学生管理系统开发
2020/07/24 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
公关关系专员的自我评价分享
2013/11/20 职场文书
售后服务经理岗位职责范本
2014/02/22 职场文书
优乐美广告词
2014/03/14 职场文书
公务员更新知识培训实施方案
2014/03/31 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
英文求职信范文
2014/05/23 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS