VUE实现分页组件步奏详解

这次给大家带来VUE实现分页组件步奏详解,VUE实现分页组件的注意事项有哪些,下面就是实战案例,一起来看一下。

分页是WEB开发中很常用的功能,尤其是在各种前后端分离的今天,后端API返回数据,前端根据数据的count以及当前页码pageIndex来计算分页页码并渲染到页面上已经是一个很普通很常见的功能了。从最开始的jquery时代到现在的各种各样的前端框架时代,分页功能都是必不可少的。

分页大多数(基本上)情况下都是对异步数据列表的处理,这里首先需要明白一下分页的流程。

在已知每页显示数据量pageSize以及当前页码pageIndex的情况下:

请求API,返回第一屏数据(pageSize内)以及所有相关条件的数据总量count

将数据总量传递给page组件,来计算页码并渲染到页面上

点击页码,发送请求获取该页码的数据,返回数据总量count以及该页码下的数据条目。

由于获取数据条件的变化(假设是个搜索,关键词变了),count是不定的;再或者,有个select下拉框,来控制每页显示的数据量pageSize,当它变化的时候,总页码肯定也是要变化的。因此很多情况下要重新计算页码并渲染。

了解了流程,在Vue中实现一个分页组件也就变得简单了。

简单处理,样式类似于bootstrap的分页组件,在第一页时,禁用上一页,以及首页按钮;在最后一页时,禁用下一页,以及尾页按钮;超出范围的页码以…来代替,效果图如下:

由于获取数据条件的变化(假设是个搜索,关键词变了),count是不定的;再或者,有个select下拉框,来控制每页显示的数据量pageSize,当它变化的时候,总页码肯定也是要变化的。因此很多情况下要重新计算页码并渲染。

了解了流程,在Vue中实现一个分页组件也就变得简单了。

简单处理,样式类似于bootstrap的分页组件,在第一页时,禁用上一页,以及首页按钮;在最后一页时,禁用下一页,以及尾页按钮;超出范围的页码以…来代替,效果图如下:

分页组件
template

  
  • prev
  • first
  • ...
  • {{ pager }}
  • ...
  • last
  • next

登录后复制

style(scss)

.mo-paging {  display: inline-block;  padding: 0;  margin: 1rem 0;  font-size: 0;  list-style: none;  user-select: none;  > .paging-item {    display: inline;    font-size: 14px;    position: relative;    padding: 6px 12px;    line-height: 1.42857143;    text-decoration: none;    border: 1px solid #ccc;    background-color: #fff;    margin-left: -1px;    cursor: pointer;    color: #0275d8;    &:first-child {      margin-left: 0;    }    &:hover {      background-color: #f0f0f0;      color: #0275d8;    }    &.paging-item--disabled,    &.paging-item--more{      background-color: #fff;      color: #505050;    }    //禁用    &.paging-item--disabled {      cursor: not-allowed;      opacity: .75;    }    &.paging-item--more,    &.paging-item--current {      cursor: default;    }    //选中    &.paging-item--current {      background-color: #0275d8;      color:#fff;      position: relative;      z-index: 1;      border-color: #0275d8;    }  }}

登录后复制

javascript

export default {  name : 'MoPaging',  //通过props来接受从父组件传递过来的值  props : {     //页面中的可见页码,其他的以...替代, 必须是奇数    perPages : {       type : Number,      default : 5     },     //当前页码    pageIndex : {      type : Number,      default : 1    },     //每页显示条数    pageSize : {      type : Number,      default : 10    },     //总记录数    total : {      type : Number,      default : 1    },   },  methods : {    prev(){      if (this.index > 1) {        this.go(this.index - 1)      }    },    next(){      if (this.index < this.pages) {        this.go(this.index + 1)      }    },    first(){      if (this.index !== 1) {        this.go(1)      }    },    last(){      if (this.index != this.pages) {        this.go(this.pages)      }    },    go (page) {      if (this.index !== page) {        this.index = page        //父组件通过change方法来接受当前的页码        this.$emit('change', this.index)      }    }  },  computed : {     //计算总页码    pages(){      return Math.ceil(this.size / this.limit)    },     //计算页码,当count等变化时自动计算    pagers () {      const array = []      const perPages = this.perPages      const pageCount = this.pages      let current = this.index      const _offset = (perPages - 1) / 2        const offset = {        start : current - _offset,        end  : current + _offset      }       //-1, 3      if (offset.start  pageCount) {        offset.start = offset.start - (offset.end - pageCount)        offset.end = pageCount      }      if (offset.start  1)      this.showNextMore = (offset.end < pageCount)       for (let i = offset.start; i <= offset.end; i++) {        array.push(i)      }       return array    }  },  data () {    return {      index : this.pageIndex, //当前页码      limit : this.pageSize, //每页显示条数      size : this.total || 1, //总记录数      showPrevMore : false,      showNextMore : false    }  },  watch : {    pageIndex(val) {      this.index = val || 1    },    pageSize(val) {      this.limit = val || 10    },    total(val) {      this.size = val || 1    }  }}

登录后复制

父组件中使用

  

  • ...

import MoPaging from './paging' export default { //显示的声明组件 components : { MoPaging }, data () { return { pageSize : 20 , //每页显示20条数据 currentPage : 1, //当前页码 count : 0, //总记录数 items : [] } }, methods : { //获取数据 getList () { //模拟 let url = `/api/list/?pageSize=${this.pageSize}¤tPage=${this.currentPage}` this.$http.get(url) .then(({body}) => { //子组件监听到count变化会自动更新DOM this.count = body.count this.items = body.list }) }, //从page组件传递过来的当前page pageChange (page) { this.currentPage = page this.getList() } }, mounted() { //请求第一页数据 this.getList() } }

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

Vue-Router的滚动行为使用详解

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

Particles.js库在vue里如何使用

BootStrap操作数据表格

以上就是VUE实现分页组件步奏详解的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月8日 12:58:30
下一篇 2025年3月8日 12:58:35

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

相关推荐

  • JS面向对象的使用详解

    这次给大家带来JS面向对象的使用详解,JS面向对象使用的注意事项有哪些,下面就是实战案例,一起来看一下。 数据类型 在JavaScript中,数据类型分为两类: 原始类型 保存一些简单数据,如true,5等。JavaScript共有5中原始…

    编程技术 2025年3月8日
    200
  • clipboard.js实现复制功能步奏详解

    这次给大家带来clipboard.js实现复制功能步奏详解,clipboard.js实现复制功能的注意事项有哪些,下面就是实战案例,一起来看一下。 最近在工作中有一个需求,就是需要使用一个按钮实现相应内容的复制。在网上找了很多解决方案,最后…

    编程技术 2025年3月8日
    200
  • AngularJS注册表单验证的步奏详解

    这次给大家带来AngularJS注册表单验证的步奏详解,AngularJS注册表单验证的注意事项有哪些,下面就是实战案例,一起来看一下。 //email验证 $(function(){ //input标签获取焦点/失去焦点时调用方法 $(“…

    编程技术 2025年3月8日
    200
  • angular4关于表单校验步奏详解

    这次给大家带来angular4关于表单校验步奏详解,angular4关于表单校验的注意事项有哪些,下面就是实战案例,一起来看一下。 本章中介绍响应式表单的创建及表单输入值的校验,对于模板表单就略过。 一、使用响应式表单的步骤 1、在模块(一…

    编程技术 2025年3月8日
    200
  • JS中多态使用详解

    这次给大家带来JS中多态使用详解,JS中多态使用的注意事项有哪些,下面就是实战案例,一起来看一下。  多态在面向对象编程语言中是十分重要的。在JAVA中是通过继承来得到多态的效果。如下: public abstract class Anim…

    编程技术 2025年3月8日
    200
  • vue-router的使用详解

    这次给大家带来vue-router的使用详解,vue-router使用的注意事项有哪些,下面就是实战案例,一起来看一下。 vue route demo Hello App! <!– 默认会被渲染成一个 “ 标签 –> Go…

    编程技术 2025年3月8日
    200
  • TabBarIOS使用详解

    这次给大家带来TabBarIOS使用详解,TabBarIOS使用的注意事项有哪些,下面就是实战案例,一起来看一下。 import React, { Component } from ‘react’;import { StyleSheet, …

    编程技术 2025年3月8日
    200
  • vue2.x双向绑定封装详解

    这次给大家带来vue2.x双向绑定封装详解,vue2.x双向绑定封装的注意事项有哪些,下面就是实战案例,一起来看一下。 上代码: vue select2 封装 .content{ text-align: center; padding:50…

    编程技术 2025年3月8日
    200
  • js与服务器时间同步的步奏详解

    这次给大家带来js与服务器时间同步的步奏详解,js与服务器时间同步的注意事项有哪些,下面就是实战案例,一起来看一下。 方案1:每次倒计时去服务端请求时间 //开启定时器var timer = setInterval(function () …

    编程技术 2025年3月8日
    200
  • 预加载InstantClick使用详解

    这次给大家带来预加载InstantClick使用详解,预加载InstantClick使用的注意事项有哪些,下面就是实战案例,一起来看一下。 昨晚在改造的时候代码高亮没法执行,准确的说是只执行一次,第二次就不执行了。所以发文说明一下,而且大致…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论