使用Vue构建可重用的分页组件

分页组件在web项目中是十分常见的组件,让我们使用vue构建可重用的分页组件,关于基本结构和相关事件监听大家参考下本文

Web应用程序中资源分页不仅对性能很有帮助,而且从用户体验的角度来说也是非常有用的。在这篇文章中,将了解如何使用Vue创建动态和可用的分页组件。

基本结构

分页组件应该允许用户访问第一个和最后一个页面,向前和向后移动,并直接切换到近距离的页面。

大多数应用程序在用户每次更改页面时都会发出API请求。我们需要确保组件允许这样做,但是我们不希望在组件内发出这样的请求。这样,我们将确保组件在整个应用程序中是可重用的,并且请求都是在操作或服务层中进行的。我们可以通过使用用户单击的页面的数字触发事件来实现此目的。

立即学习“前端免费学习笔记(深入)”;

有几种可能的方法来实现API端点上的分页。对于这个例子,我们假设API告诉我们每个页面的结果数、页面总数和当前页面。这些将是我们的动态 props 。

相反,如果API只告诉记录的总数,那么我们可以通过将结果的数量除以每一页的结果数来计算页数: totalResults / resultsPerPage 。

我们想要渲染一个按钮到 第一页 、 上一页 、 页面数量范围 、 下一页 和 最后一页 :

[first] [next] [1] [2] [3] [previous] [last]

比如像下图这样的一个效果:

使用Vue构建可重用的分页组件 

尽管我们希望渲染一个系列的页面,但并不希望渲染所有可用页面。让我们允许在我们的组件中设置一个最多可见按钮的 props 。

既然我们知道了我们想要的组件要做成什么,需要哪些数据,我们就可以设置HTML结构和所需要的 props 。

  
        
  •           
  •     
  •           
  •         
  •           
  •     
  •           
  •   
Vue.component('pagination', {  template: '#pagination',  props: {    maxVisibleButtons: {      type: Number,      required: false,      default: 3    },    totalPages: {      type: Number,      required: true    },    total: {      type: Number,      required: true    },    currentPage: {      type: Number,      required: true    }  }})

登录后复制

上面的代码注册了一个 pagination 组件,如果调用这个组件:

  

登录后复制

这个时候看到的效果如下:

使用Vue构建可重用的分页组件 

注意,为了能让组件看上去好看一点,给组件添加了一点样式。

事件监听

现在我们需要通知父组件,当用户单击按钮时,用户点击了哪个按钮。

我们需要为每个按钮添加一个事件监听器。 v-on 指令 允许侦听DOM事件。在本例中,我将使用 v-on 的快捷键 来侦听单击事件。

为了通知父节点,我们将使用 $emit 方法 来发出一个带有页面点击的事件。

我们还要确保分页按钮只有在页面可用时才唯一一个当前状态。为了这样做,将使用 v-bind 将 disabled 属性的值与当前页面绑定。我们还是使用 :v-bind 的快捷键 : 。

为了保持我们的 template 干净,将使用 computed 属性 来检查按钮是否被禁用。使用 computed 也会被缓存,这意味着只要 currentPage 不会更改,对相同计算属性的几个访问将返回先前计算的结果,而不必再次运行该函数。

  
        
  •           
  •     
  •           
  •     
  •           
  •     
  •           
  •     
  •           
  •   
Vue.component('pagination', {  template: '#pagination',  props: {    maxVisibleButtons: {      type: Number,      required: false,      default: 3    },    totalPages: {      type: Number,      required: true    },    total: {      type: Number,      required: true    },    currentPage: {      type: Number,      required: true    }  },  computed: {    isInFirstPage: function () {      return this.currentPage === 1    },    isInLastPage: function () {      return this.currentPage === this.totalPages    }  },  methods: {    onClickFirstPage: function () {      this.$emit('pagechanged', 1)    },    onClickPreviousPage: function () {      this.$emit('pagechanged', this.currentPage - 1)    },    onClickPage: function (page) {      this.$emit('pagechanged', page)    },    onClickNextPage: function () {      this.$emit('pagechanged', this.currentPage + 1)    },    onClickLastPage: function () {      this.$emit('pagechanged', this.totalPages)    }  }})

登录后复制

在调用 pagination 组件时,将 totalPages 和 total 以及 currentPage 传到组件中:

  

let app = new Vue({  el: '#app',  data () {    return {      currentPage: 2    }  }})

登录后复制

运行上面的代码,将会报错:

使用Vue构建可重用的分页组件 

不难发现,在 pagination 组件中,咱们还少了 pages 。从前面介绍的内容,我们不难发现,需要计算出 pages 的值。

Vue.component('pagination', {  template: '#pagination',  props: {    maxVisibleButtons: {      type: Number,      required: false,      default: 3    },    totalPages: {      type: Number,      required: true    },    total: {      type: Number,      required: true    },    currentPage: {      type: Number,      required: true    }  },  computed: {    isInFirstPage: function () {      return this.currentPage === 1    },    isInLastPage: function () {      return this.currentPage === this.totalPages    },    startPage: function () {      if (this.currentPage === 1) {        return 1      }      if (this.currentPage === this.totalPages) {        return this.totalPages - this.maxVisibleButtons + 1      }      return this.currentPage - 1    },    endPage: function () {      return Math.min(this.startPage + this.maxVisibleButtons - 1, this.totalPages)    },    pages: function () {      const range = []      for (let i = this.startPage; i 

这个时候得到的结果不再报错,你在浏览器中将看到下图这样的效果:

使用Vue构建可重用的分页组件 

添加样式

现在我们的组件实现了最初想要的所有功能,而且添加了一些样式,让它看起来更像一个分页组件,而不仅像是一个列表。

我们还希望用户能够清楚地识别他们所在的页面。让我们改变表示当前页面的按钮的颜色。

为此,我们可以使用对象语法将HTML类绑定到当前页面按钮上。当使用对象语法绑定类名时,Vue将在值发生变化时自动切换类。

虽然 v-for 中的每个块都可以访问父作用域范围,但是我们将使用 method 来检查页面是否处于 active 状态,以便保持我们的 templage 干净。


Vue.component('pagination', {  template: '#pagination',  props: {    maxVisibleButtons: {      type: Number,      required: false,      default: 3    },    totalPages: {      type: Number,      required: true    },    total: {      type: Number,      required: true    },    currentPage: {      type: Number,      required: true    }  },  computed: {    isInFirstPage: function () {      return this.currentPage === 1    },    isInLastPage: function () {      return this.currentPage === this.totalPages    },    startPage: function () {      if (this.currentPage === 1) {        return 1      }      if (this.currentPage === this.totalPages) {        return this.totalPages - this.maxVisibleButtons + 1      }      return this.currentPage - 1    },    endPage: function () {      return Math.min(this.startPage + this.maxVisibleButtons - 1, this.totalPages)    },    pages: function () {      const range = []      for (let i = this.startPage; i 

接下来,在 pages 中添加当前状态:



登录后复制  

这个时候你看到效果如下:

使用Vue构建可重用的分页组件 

但依然还存在一点点小问题,当你在点击别的按钮时, active 状态并不会随着切换:

使用Vue构建可重用的分页组件 

继续添加代码改变其中的效果:

let app = new Vue({  el: '#app',  data () {    return {      currentPage: 2    }  },  methods: {    onPageChange: function (page) {      console.log(page)      this.currentPage = page;    }  }})

登录后复制

在调用组件时:

  

登录后复制

这个时候的效果如下了:

使用Vue构建可重用的分页组件 

到这里,基本上实现了咱想要的分页组件效果。

无障碍化处理

熟悉Bootstrap的同学都应该知道,Bootstrap中的组件都做了无障碍化的处理,就是在组件中添加了WAI-ARIA相关的设计。比如在分页按钮上添加 aria-label 相关属性:

使用Vue构建可重用的分页组件 

在我们这个组件中,也相应的添加有关于WAI-ARIA相关的处理:

  
        
  •           
  •     
  •           
  •     
  •           
  •     
  •           
  •     
  •           
  •   

登录后复制

这样有关于 aria 相关的属性就加上了:

使用Vue构建可重用的分页组件 

最终的效果如下,可以点击下面的连接访问:

https://codepen.io/airen/pen/mxMLrG

相关推荐:

vue构建一个自动建站项目

vue构建多页面应用实例代码分享

以上就是使用Vue构建可重用的分页组件的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2776563.html

(0)
上一篇 2025年3月8日 14:53:49
下一篇 2025年2月19日 11:18:52

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 五种JavaScript常见函数总结

    在 JavaScript 中有一些问题会被拿出来经常讨论,这些问题每个人都有不同的思路,想要理解这些问题,最好的方法就是自己实现一遍,话不多说,开始正题。本篇文章给大家分享的是 五种JavaScript常见函数总结,内容挺不错的,希望可以帮…

    编程技术 2025年3月8日
    200
  • js自执行函数

    这次的这篇文章向大家分享的内容是js自执行函数 ,有需要的朋友可以参考一下 1 用自执行函数来包装代码格式 APP = function(){     var a,b; //变量a、b外部不可见     return {          …

    编程技术 2025年3月8日
    200
  • js 的引用类型

    这次的这篇文章向大家分享的内容是关于js的引用类型,有需要的朋友们可以看一下 引用类型的值(对象)是引用类型的一个实例,,在js 里引用类型是一种数据结构,通常被称为类,es6貌似加了类这个概念, 1:object是一个基础类,其他所有类型…

    编程技术 2025年3月8日
    200
  • 2017、2018年JS面试题记录分享

    这次的这篇文章给大家带来的内容是2017、2018年JS面试题记录分享,有感兴趣的小伙伴可以看一下 推荐相关文章:2020年最全js面试题整理(最新) 2017面试分享(js面试题记录) 1. 最简单的一道题     ’11’ * 2   …

    2025年3月8日
    200
  • js 开发跨平台界面程序

    HTML + CSS + JS 做页面布局等样式控制有种与身俱来的优越感,于是 NodeJS 的世界里便产生了  Node-Webkit(已更名为 NW.js) 和 Atom Shell,它们各自的代表作有 LightTable 和堪与 S…

    编程技术 2025年3月8日
    200
  • JavaScript设计模式系列一:工厂模式

    本篇文章给大家分享的是javascript设计模式系列:工厂模式,有感兴趣的朋友可以看一下 设计模式 设计模式(design pattern)概念:是一套反复使用、思想成熟、经过分类和无数实战设计经验的总结。是为了代码可重用、可扩展、可解耦…

    编程技术 2025年3月8日
    200
  • 用json实现ajax的数据传输方法

    这次给大家带来,用json实现ajax数据传输的注意事项有哪些,下面就是实战案例,一起来看一下。 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON…

    2025年3月8日 编程技术
    200
  • JavaScript设计模式系列二:单例模式

    本篇文章给大家分享的是javascript设计模式系列二:单例模式,有感兴趣的朋友可以看一下 单例模式 前言:本系列代码已上传到GitHub地址 https://github.com/HolyZheng/… 什么是单例模式? 单…

    编程技术 2025年3月8日
    200
  • 在实战项目中Ajax应该如何传递JSON

    这次给大家带来在实战项目中Ajax应该如何传递JSON,在实战项目中Ajax传递JSON的注意事项有哪些,下面就是实战案例,一起来看一下。 前面的话   虽然ajax全称是asynchronous javascript and XML。但目…

    2025年3月8日
    200
  • JavaScript设计模式系列三:建造者模式

    本篇文章给大家分享的是javascript设计模式系列三:建造者模式,有感兴趣的朋友可以看一下 建造者模式 建造者模式(builder pattern)比较简单,它属于创建型模式的一种,将一个复杂的对象分解成多个简单的对象来进行构建,将复杂…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论