Vue手写分页器

手写分页器组件(vue2) 效果图如下: 1.首先要确认参数 currentPage:当前页码;pageSize:每页有多少条数据;pageGroup:连续页码数量; total:数据总数;totalPage:总页数 2.计算总页数,使用 数据总数 / 每页有多少条数据 向上取整即可。(放在computed中自动计算) computed:{ // 共有多少页 otalPage(){ return Math.ceil(this.total / this.pageSize); } . 阅读详情

如何封装一个分页器组件

文章最后会提供源码

分析与代码部分

需要分页器的原因:从服务器中获取的数据很多,如果全部一次性加载会导致卡顿,用户体验差

我们写一个分页器需要的外部数据(即使用该分页器组件时需要通过props传入的数据):

  1. 当前是第几页 pageNo

  2. 每一页展示多少数据 pageSize

  3. 整个分页器一共有多少数据 total

  4. 分页器连续页码个数 continues(通常是奇数5 / 7,一般要求对称)

ps:其中暗含一个隐藏数据:整个分页器一共有多少页 Math.ceil(total / pageSize)




下面开始写代码:

计算连续页码的起始数字与结束数字

连续页码就是分页器中按数字顺序连续显示的页码,个数为 continues

在这里插入图片描述
例如上图中的 3、4、5、6、7 这5个页码,我们要先计算出这几个连续页码的开始页码和结束页码

逻辑:当前页码为第n页,假设continues = 5,那么起始数字为n-2,结束数字为n+2

// computed中
totalPage() {
	return Math.ceil(this.total / this.pageSize);
},
// 连续页码起始数字与结束数字
startNumAndEndNum() {
    const { pageNo, totalPage, continues } = this;
    let start = 0;
    let end = 0;
    // 如果总页数少于连续页码数,只展示 1~最后页码数 即可
    if (totalPage < continues) {
        start = 1;
        end = totalPage;
    // 如果总页数大于等于连续页码数
    } else {
        start = pageNo - Math.floor(continues / 2);
        end = pageNo + Math.floor(continues / 2);
        // start为 0 / 负数
        if (start < 1) {
            start = 1;
            end = continues;
        }
        // end大于总页数
        if (end > totalPage) {
            start = totalPage - continues + 1;
            end = totalPage;
    	}
}
	return {start, end};
},
连续页码数组
// computed中
pagesArr() {
    let arr = [];
    let pageNum = this.startNumAndEndNum.start;
    arr.length = (this.totalPage < this.continues ? this.totalPage : this.continues);
    for (let i = 0; i < arr.length; i++) {
        arr[i] = pageNum;
        pageNum++;
    }
    return arr
}
渲染数据
<ul>
    <li class="prev disabled">
        <a href="#">« 上一页</a>
    </li>
    <li v-show="startNumAndEndNum.start > 1">
        <a href="#">1</a>
    </li>
    <li class="dotted" v-show="startNumAndEndNum.start > 2"><span>...</span></li>

    <!-- 中间部分 -->
    <li v-for="(p, index) in pagesArr" :key="index">
        <a href="#">{{p}}</a>
    </li>

    <li class="dotted" v-show="startNumAndEndNum.end < totalPage - 1"><span>...</span></li>
    <li v-show="startNumAndEndNum.end < totalPage">
        <a href="#">{{ totalPage }}</a>
    </li>
    <li class="next">
        <a href="#">下一页 »</a>
    </li>
</ul>

完整代码:

<template>
  <div class="fr page">
    <div class="sui-pagination clearfix">
      <ul>
        <li
          class="prev"
          :class="{ disabled: pageNo === 1 }"
          @click="pageNo > 1 ? $emit('getPageNo', pageNo - 1) : null"
        >
          <a>« 上一页</a>
        </li>
        <li
          v-show="startNumAndEndNum.start > 1"
          :class="{ active: pageNo === 1 }"
          @click="$emit('getPageNo', 1)"
        >
          <a>1</a>
        </li>
        <li class="dotted" v-show="startNumAndEndNum.start > 2">
          <span>...</span>
        </li>

        <!-- 中间部分 -->
        <li
          v-for="(page, index) in pagesArr"
          :key="index"
          :class="{ active: pageNo === page }"
          @click="$emit('getPageNo', page)"
        >
          <a>{{ page }}</a>
        </li>

        <li class="dotted" v-show="startNumAndEndNum.end < totalPage - 1">
          <span>...</span>
        </li>
        <li
          v-show="startNumAndEndNum.end < totalPage"
          :class="{ active: pageNo === totalPage }"
          @click="$emit('getPageNo', totalPage)"
        >
          <a>{{ totalPage }}</a>
        </li>
        <li
          class="next"
          :class="{ disabled: pageNo === totalPage }"
          @click="pageNo < totalPage ? $emit('getPageNo', pageNo + 1) : null"
        >
          <a>下一页 »</a>
        </li>
      </ul>
      <div>
        <span>共 {{ total }} 条</span>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "Pagination",
  props: ["pageNo", "pageSize", "total", "continues"],
  computed: {
    totalPage() {
      return Math.ceil(this.total / this.pageSize);
    },
    // 连续页码起始数字与结束数字
    startNumAndEndNum() {
      const { pageNo, continues, totalPage } = this;
      let start = 0;
      let end = 0;
      // 如果总页数少于连续页数
      if (totalPage < continues) {
        start = 1;
        end = totalPage;
      } else {
        start = pageNo - Math.floor(continues / 2);
        end = pageNo + Math.floor(continues / 2);
        // start出现0/负数
        if (start < 1) {
          start = 1;
          end = continues;
        }
        // end大于总页数
        if (end > totalPage) {
          start = totalPage - continues + 1;
          end = totalPage;
        }
      }
      return { start, end };
    },
    pagesArr() {
      let arr = [];
      // 连续页码个数
      arr.length =
        this.totalPage < this.continues ? this.totalPage : this.continues;
      // 第一个连续页码
      let pageNum = this.startNumAndEndNum.start;
      for (let i = 0; i < arr.length; i++) {
        arr[i] = pageNum;
        pageNum++;
      }
      return arr;
    },
  },
};
</script>

<style scoped lang="less">
.page {
  display: flex;
  justify-content: center;
  overflow: hidden;

  .sui-pagination {
    margin: 18px 0;

    ul {
      margin-left: 0;
      margin-bottom: 0;
      vertical-align: middle;
      float: left;

      li {
        line-height: 18px;
        display: inline-block;

        a {
          position: relative;
          float: left;
          background-color: #fff;
          padding: 9px 18px;
          border: 1px solid #e0e9ee;
          margin-left: -1px;
          line-height: 18px;
          text-decoration: none;
          font-size: 14px;
          color: #333;
          cursor: pointer;
        }

        &.active {
          a {
            background-color: #e1251b;
            color: #fff;
            cursor: default;
          }
        }

        &.prev {
          a {
            margin-left: 0px;
            background-color: #fafafa;
          }
        }

        &.disabled {
          a {
            color: #999;
            cursor: default;
          }
        }

        &.dotted {
          span {
            position: relative;
            float: left;
            padding: 9px 18px;
            border: 1px solid #e0e9ee;
            margin-left: -1px;
            background-color: #fff;
            font-size: 14px;
            line-height: 18px;
            text-decoration: none;
            color: #333;
          }
        }

        &.next {
          a {
            background-color: #fafafa;
          }
        }
      }
    }

    div {
      margin-top: 10px;
      margin-left: 20px;
      color: #333;
      font-size: 14px;
      float: left;
      width: 80px;
    }
  }
}
</style>

在其他组件中使用:

<!-- 分页器 -->
<Pagination
	// 引号内写入想传入的数据
	:pageNo=""
	:pageSize=""
	:total=""
	:continues=""
	@getPageNo=""
/>
单晶塑性abaqus-umat自学 单晶塑性abaqus-umat 摘要1. 简介2. 单晶弹塑性本构模型回顾2.1运动学 本文以翻译黄永刚老师的umat文章为主,这个颜色的为个人的理解。 摘要 包含单晶塑性的abaqus用户材料子程序。本文回顾有限元形式的单晶弹塑性和黏弹塑性,包含小变形理论,以及严格的有限变形和有限旋转理论。单晶的非弹性变形由于晶体滑移,假定遵从Schmid准则。提出多种多样的分切应力与剪切变形的自硬化和潜硬化关系,并且包含在子程序内。 1. 简介   有限元程序ABAQUS已经广泛应用在固体的变形与应力分析。除了自身大量 阅读详情

相关推荐

NVMe-MI 协议解析:带外管理框架与实现原理

本文深入解析了NVMe-MI协议,这是一种用于NVMe固态硬盘的标准化带外管理接口。文章详细阐述了其独立于操作系统的管理框架,通过MCTP协议栈实现,支持SMBus/I2C、PCIe VDM和I3C等物理层,从而在系统故障时仍能可靠地进行健康监控、固件升级等关键运维操作,是现代数据中心存储管理的核心基础设施。

lll78的博客 961

Vue3手写分页器

vue3实现分页器功能

m0_56698268的博客 2025

从医疗成像到工业检测:CMOS图像传感器NIR技术的最新应用案例解析

本文深入解析了CMOS图像传感器NIR技术在医疗成像和工业检测中的最新应用案例。通过提升量子效率至70%,NIR技术实现了血管可视化、材料缺陷检测等突破性进展,显著提高了医疗诊断精度和工业质检效率。文章还探讨了系统集成关键考量和前沿发展趋势。

weixin_30879169的博客 90

手写Vue个人组件库——fl-Pagination分页器

Pagination 分页 当数据量过多时,使用分页分解数据。 基础用法 数据较少的效果 数据较多的效果 当总数据量大于50条时会自动呈现如上的第二种效果,可配合maxShowPageCard设置每一组分页的页签量。 同时pageSizeList为必填选项,第一个下标的值即为每页所展示的数量。 <template> <fl-Pagination :total = 80 :maxShowPageCard = 5 :pageSizeList = [8

量子前端的博客 906

ais信号接收设备_国内首款基于软件无线电技术的AIS基站投入测试使用

星网宇达子公司北京凯盾环宇科技有限公司经过多年的潜心研发,成功研制出国内首台基于软件无线电(SDR)的CATON 9011 AIS基站。该基站采用软件无线电技术,利用软件数字技术代替传统的模拟电路,大大的降低了模拟器件的使用率,提高了基站的可靠性和使用年限。CATON 9011 AIS基站研制依据ITU-R M.1371-5、IEC 62320-1、IEC 61162-1等国际标准,兼容...

weixin_29057163的博客 2334

浅谈武术擂台格斗机器人大赛

武术擂台机器人赛是工科类专业的一个跨学科的竞赛项目,它涵盖了机械结构、硬件电路和计算机程序等技术领域。笔者在校期间有幸参加过四次这样的比赛,有成功也有失败,对此深有感悟。本文仅为个人观点,有说得不对的地方,望积极指出,希望能帮助到有需要的人。

weixin_43811044的博客 1万+

手写一个vue分页组件

先上图 父组件 <my-page :pageSize="pageSize" :total="allcount" @pageChange="pageChange"></my-page> <script> export default { components:{MyPage}, name: 'people', data () { return { pageSize:100, curpage:1, allcount

qq_35035975的博客 565

NY8A053E 例程 之 PWM Ouput

更多关于NY8A053E的相关例程请留言!

倪彬笑阳的博客 2925

分页计算公式(vue实现分页效果)

文章目录一、效果二、分页相关公式三、前端页面实现 提示:以下是本篇文章正文内容,下面案例可供参考 一、效果 二、分页相关公式 已知量: 当前页: current 每页条数: pageSize 总条数: total 总页数: total/pageSIze + 1 当前页第一条: total/pageSIze + 1 当前页最后一条: (需要做判断: 当前页是否为最后一页) current != total/pageSIze + 1?current=total/pageSIze + 1:to.

Stargazer(仰望星空)的博客 2427

PyCharm高效配置Gitee全攻略

本文介绍了如何在PyCharm和VS Code中配置Gitee插件并管理代码。主要内容包括:1) PyCharm连接Gitee的配置步骤;2) 代码拉取与冲突解决方法;3) VS Code界面功能区域详解;4) 完整的代码提交流程(暂存→提交→推送)。特别说明了VS Code中Git面板的使用方法,以及推送代码到Gitee远程仓库的具体操作步骤。文章还提供了解决代码冲突的建议和注意事项,帮助开发者更好地进行版本控制。

ZhangJiqun&191cm&85kg 300

双端之Nginx+Php结合PostgreSQL搭建Wordpress

制作的 PG4WP 分支版本,它与所有版本的 WordPress 兼容,解决了原版的一些问题。参数,确保 PostgreSQL 正在监听默认端口(通常是 5432),或者你自定义的端口。:PG4WP 插件存在缺陷和不完整的功能,可能与最新版本的 WordPress 不兼容。的插件,它允许 WordPress 使用 PostgreSQL 数据库。,如果看到 Nginx 的默认欢迎页面,说明 Nginx 已正确安装。,如果看到 Nginx 的默认欢迎页面,说明 Nginx 已正确安装。

宇宙第一小趴菜的博客 1891

vue 手写个分页器

total_pages:int 总页数 page_num:int 当前页 均在mounted中获取过 this.sort和this.desc顾名思义 这里不重要 略过 应该有办法写a的href 但是暂时还不太会build url with params 就先手写个to_page凑合用 顺便能阻止上一页/下一页越界的跳转 ...

ietar的博客 366

保姆级教程:一步步创建 ABAP Text Table

有朋友反馈,问有没有一个自己动手创建 Text Table 的例子,因为自己没有动手实践过,总觉得心里不踏实。这个行为的语义是,ZAI_TYPE_T 这张表的 AI_TYPE 字段值,不能随便维护,必须是表。然后另一个需要添加的字段是 AI_TYPE 这个字段值对应的文本值,本例笔者采用 SAP 标准的。也是自己创建的,很简单的一个 Data Element,类型为 CHAR,长度为 2.依次给主表的 01,02,03 三个字段值维护对应的描述信息,最后效果如下。按照下面的字段结构,创建另一。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4276

Element 分页器

和elementui的分页器基本一致。

m0_66675766的博客 243

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

手写分页器

手写分页器

m0_62508027的博客 248

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

html+vue.js 实现分页可兼容IE

当功能比较简单,在单一html中使用vue.js分页展示数据,并未安装脚手架,或使用相关UI框架,此时需要手写一个分页器,不失为最合理最便捷的解决方案, 先看一下实现效果: 上代码: 1.简单搞一搞 CSS,此处代码有折叠,Click Me~ [v-cloak] { display: none; } #app { text-align: center; padding-top:...

Echoyya、的博客 148

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

vue+element ui 写分页器

分页器vue+element ui <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

这里是前端,是不一样的前端 174

手写一个简单的分页器

封装分页器 1. 前言 分页器基本上是任何网站必须要有的一个组件,为什么需要分页器,当后台传入了大量的数据,那么在前端拿到数据,如果直接展示很有可能或造成卡顿,同时消耗过多的内存,给用户带来的浏览效果就不好。所以,分页器的使用可以一次性只展示部分数据,用户可以非常方便的跳转不同的页面来访问内容。虽然现在很多的UI库都有这个组件,使用也非常的方便,但是我们也应该要知道,怎么手写一个分页器。 2. 准备 先搭建一个静态的分页器。效果如下图。 <template> <div cl

qq_18824403的博客 3852

【前端】手写一个简单的分页器

最后:分页器连续的页面个数(看上面的图片,页面之间会有省略号,意思就是如果我设置连续的页数是3,那么如果有10页,当前是第5页,页面中显示的就是应该是 1 …分页器基本上是任何网站必须要有的一个组件,为什么需要分页器,当后台传入了大量的数据,那么在前端拿到数据,如果直接展示很有可能或造成卡顿,同时消耗过多的内存,给用户带来的浏览效果就不好。在我们拿到父组件传递过来的数据,我们需要计算两个属性的值,分别是:总共多少页和连续页面的起始数字和结束数字。,中间部分的连续页面数,最右边的…先搭建一个静态的分页器。

qq_43787947的博客 940

html++好看的分页页面,html+vue.js 实现漂亮分页功能可兼容IE

当功能比较简单,在单一html中使用vue.js分页展示数据,并未安装脚手架,或使用相关UI框架,此时需要手写一个分页器,不失为最合理最便捷的解决方案先看一下实现效果: 上代码:1.简单搞一搞 CSS,此处代码有折叠2.简单搞一搞 HTML第{{pageIndex}}页, 每页显示{{pageSize}}条共{{dataListLength}}条<{{item}}>{{pageSize...

weixin_33556941的博客 425

手写分页器组件

主题 数据量过大的时候,前端分页是避免不了的事情,记录一次手写分页器组件(估计我这辈子只会手写这一次)。 首先把静态分页器弄出来。再做js逻辑设计。 <template> <div class="pagination"> <button>上一页</button> <button>1</button> <button>···</button> <button>3&l

qq_42356513的博客 1113

自定义分页器

前端必须要掌握的分页器,轮播图,与日历 手写,掌握原理 1:分页功能实现 为什么很多项目采用分页功能:比如电商平台有很多数据。一次加载出来会卡住 采用分页功能 Element Ul是有相应的分页组件,使用起来超级简单,但是咱们前台项目目前不用【掌握自定义分页器的功能】 2:分页器需要哪些数据(条件)? 需要知道当前是第几页:pagNo字段代表当前页数 需要知道每一页需要展示多少条数据:pageSizs字段进代表 需要知道整个分页器一共有多少条数据:total字段进行代表--...

m0_65382120的博客 1255

开箱即用:基于Vue的分页器

开箱即用的vue分页器

qq_51789751的博客 328

手写超级简单的vue分页组件

组件基本布局 template> <div class="xtx-pagination"> <a href="javascript:;" v-if="myCurrentPage==1" class="disabled">上一页</a> <a href="javascript:;" v-else @click="go(-1)">上一页</a> <span v-if="pageInfo.start>

weixin_55633731的博客 299

vue手写轮播图组件

轮播图组件是大多数项目都有的需求,当然相关的库、插件多的很,但是呢我还是喜欢自己折腾一下。 需求 在做公司项目时其实需求很简单就是能滑动轮播,自动轮播,循环轮播完事了。 需求版本 首先html部分 <template> <div class="my-swiper-box" ref="swiperBox"> <!-- 滑块主体 --> ...

weixin_43139949的博客 2047

vue修改当前页面query参数

最近在项目中手写分页器(为什么手写,因为对分页器样式外观要求比较严苛),遇到一个需求,就是我们在点击分页的时候,再进入详情,之后回退希望能够回到之前的页码值。解决这个需求,个人总结了两种方法。

m0_71231013的博客 3610
上一篇: 尚硅谷Vue2学习笔记 (二)
下一篇: npm i swiper失败-npm ERR! code 255 “Love Swiper? Support Vladimir‘s work by donating or pledging on pa
noirscent
博客等级 码龄6年 4粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值