大二第四周总结——用原生js封装一个分页器
用原生js封装一个分页器
起因:这次项目还是用原生的js来写的,我负责的是后台,分页是后台最常见的一个功能了,于是干脆封装一下,废话少说,直接上代码
这里是基本的样式
.pagination {display: flex;width: 600px;height: 35px;margin: 0 auto;margin-left: 275px;/* border: 1px solid red; */
}.pagination span a {box-sizing: border-box;text-decoration: none;color: black;
}.pagination span {/* border: 1px solid red; */text-align: center;width: 40px;height: 35px;line-height: 35px;margin: 0px 2px;
}.pagination span i {font-size: 10px;font-weight: 100;
}.pagination span img {width: 30px;height: 25px;
}.pagination .pageStyle a {display: block;text-align: center;width: 40px;height: 35px;line-height: 35px;/* background-color: bisque; */border: 1px solid #ccc;border-radius: 5px;
}.pagination .pageStyle a:hover {border: 1px solid rgb(27, 129, 121);
}.pagination .active {background-color: cadetblue;
}
这个是在js里面定义的一个分页器类
class PageClass { //定义一个分页器类 constructor(ele, pageNum, page, cb) { //需要传入4个参数,第一个容器元素,第二个页面总数,第三个当前页面数,第四个为回调函数this.ele = ele; //定义属性this.pageNum = pageNum;this.page = page;this.cb = cb;this.renderPage(); //执行渲染的方法this.operate(); //给实例化对象绑定各种操作的方法}renderPage() { //在类的原型上定义一个渲染的方法let str = '';if (this.pageNum > 5) { //判断当前分页的页面总数是否超过5页if (this.page <= 4) { //如果页面总数大于5 ,再判断当前页是否小于或者等于第四页for (let i = 0; i < 5; i++) { //如果当前页是小于等于4以内的页数 ,遍历1到5if ((i + 1) == this.page) { //判断当前页是否等于 当前 索引值(索引值从0开始) + 1str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;" class="active">${i + 1}</a></span>`;//等于的话说明渲染的是当前页,给当前页一个active的类名进行渲染} else { //如果渲染的不是当前页str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;">${i + 1}</a></span>`;//普通渲染就行了}}str += `<span><i>•••</i></span><span class="pageStyle" myPage="${this.pageNum}"><a href="javascript:;">${this.pageNum}</a></span>`;//最后渲染一个最末尾页} else if (this.page > 4 && this.page < this.pageNum - 3) { //判断当前页是否大于第四页,且小于最大页数减去 3 str += `<span class="pageStyle" myPage="1"><a href="javascript:;">1</a></span><span><i>•••</i></span>`; //渲染一个首页for (let i = this.page - 3; i < this.page + 2; i++) {if ((i + 1) == this.page) { //判断当前正在渲染的是否为当前页str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;" class="active">${i + 1}</a></span>`;//如果是当前页,给一个active类名进行渲染} else {str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;">${i + 1}</a></span>`;//如果不是,普通渲染就行}}str += `<span><i>•••</i></span><span class="pageStyle" myPage="${this.pageNum}"><a href="javascript:;">${this.pageNum}</a></span>`;//渲染一个尾页} else if (this.page >= this.pageNum - 3) {//如果当前页数大于或者等于最大页数 - 3 str += `<span class="pageStyle" myPage="1"><a href="javascript:;">1</a></span><span><i>•••</i></span>`; //渲染一个首页for (let i = this.pageNum - 5; i < this.pageNum; i++) {//从倒数第5页开始渲染if ((i + 1) == this.page) { //如果渲染的是当前页str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;" class="active">${i + 1}</a></span>`;//增加一个active类名,进行渲染} else {str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;">${i + 1}</a></span>`;//否则普通渲染}}}} else { //如果最大页数小于等于5for (let i = 0; i < this.pageNum; i++) { //直接渲染到当前最大页数if ((i + 1) == this.page) { //判断渲染的是否为当前页数str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;" class="active">${i + 1}</a></span>`;//如果是增加一个active类名,进行渲染} else {str += `<span class="pageStyle" myPage="${i + 1}"><a href="javascript:;">${i + 1}</a></span>`;//否则普通渲染就行了}}}//将所有内容渲染到容器盒子里//第一页//上一页//中间页面//下一页//最后一页this.ele.innerHTML = `<span class="first"><a href="javascript:;"> <img src="/public/img/index.png" alt=""></a></span><span class="prev"><a href="javascript:;"><img src="/public/img/before.png" alt=""></a></span>${str}<span class="next"><a href="javascript:;"><img src="/public/img/after.png" alt=""></a></span><span class="last"><a href="javascript:;"><img src="/public/img/end.png" alt=""></a></span>` ;}operate() { //在类原型上定义一个operate的方法,给这个类绑定点击事件const _that = this; //申明一个常量接收thislet firstEle = this.ele.querySelector(".first"); //获取第一页的元素let lastEle = this.ele.querySelector(".last"); //获取最后一页的元素let nextEle = this.ele.querySelector(".next"); //获取下一页的元素let prevEle = this.ele.querySelector(".prev"); //获取上一页的元素let pageStyleEles = this.ele.querySelectorAll(".pageStyle"); //获取所有的中间页面的元素firstEle.onclick = function () { //当点击第一页时_that.page = 1; //让page属性重新赋值为1_that.cb(_that.page); //并将page属性通过回调函数cb传递出去}lastEle.onclick = function () { //当点击最后一页时_that.page = _that.pageNum; //让page属性重新赋值为页面最大值_that.cb(_that.page); //并将page属性通过回调函数cb传递出去}nextEle.onclick = function () { //当点击下一页时if (_that.page < _that.pageNum) { //先判断当前页是否小于最大页_that.page = _that.page + 1; //如果没有超过,给page属性自增1_that.cb(_that.page); //并将page属性通过回调函数cb传递出去}}prevEle.onclick = function () { //当点击上一页时if (_that.page > 1) { //先判断当前页是否大于第一页_that.page = _that.page - 1; //如果是大于第一页的话,page属性自减1_that.cb(_that.page); //并将page属性通过回调函数cb传递出去}}pageStyleEles.forEach(function (pageStyleEle) { //遍历获取到中间页面的所有元素pageStyleEle.onclick = function () { //当点击其中一页时_that.page = parseInt(this.getAttribute("myPage")); //获取这个元素自定义属性,myPage,属性值是当前页 ,并将当前页赋值给page属性_that.cb(_that.page); //将page属性通过回调函数cb传递出去}});}}
在html页面中
只需要防止这样的一个盒子就行了
<div class="pagination"> </div>
使用的时候,js里面这样写
let pageEle = document.querySelector(".pagination"); //获取页面渲染的容器
ready(1); //调用渲染容器的方法,传递初始页面为1
function ready(page) { // 定义一个方法用来渲染容器new PageClass(pageEle, 1000, page, function (page) { //new 一个PageClass类,传递容器元素,总页面数,当前页面,以及回调函数console.log(page, '看看点击Page的时候页面是否会发生变化');ready(page); //回调函数调用渲染容器的方法getAllUsers(10, page);//这个是自定义的页面变化的时候获取页面数据的渲染表格的方法});
}
整个跑起来大致就是这个样子

至于显示的这个回到首页,上一页,下一页,回到最后一页的图片,可以去阿里妈妈图标库去看看,挑选自己喜欢的。分享到这里就结束了
学技术的话,看到这里就行。
我是分割线
个人的小感悟
很多人可能会选择在过年或者是期末的时候进行总结,那为什么会选择现在进行来一波回忆杀呢?
因为,距离我去年将要加入未来软件工作室就不到4天的时间了。


对我来说,这一年的成长,也许,技术也许是次要的,心理的成长占了绝大部分。
去年的这个时候,来大学快一个月的时间了,对学校的基本情况了解的差不多了,知道了未来是学校最强的小组,一股劲儿的想要来到这里,找到了当时小组大三的学姐,然后学姐把我拉进了未来软件工作室的招新群,等待工作室正式开始招新投简历,然后面试,分到未来五组当中,融入新的团体.......这就是梦的开始,也是很多事情的开始,若要究其根本,命运的齿轮究竟是从什么时候开始转动的 ? 可能是偷偷改志愿学计算机,可能是报考之后在贴吧四处找寻学校信息从此多了一位师父照拂,可能是在知乎找到了熟知学校信息的计算机学姐,从此多了一位领路人,一切的一切,把大学的画卷铺开在我面前......
去年这一年
有难关面前,能成为家人依靠的成就感
有熬夜到凌晨3,4点,连续3天睡眠时间不超过10个小时但依然活力满满的冲劲儿
有趁着水课多,连着整整睡了4,5天的疲惫
有被一次一次的抛弃,再一次一次的振作
有用自己学到的东西解决问题时候的喜悦
更有无数个加一个瞬间把自己从堕落中拉出来
专研自己的热爱
从书中寻找共鸣
去西安看看那富贵迷人眼
看那没被污染前的海
......
一些事情到此完成闭环。
我看到的,我感受的,
回忆太多,可是,经历过的千千万,都抵不过当下这一瞬间的永恒。


相关文章:
大二第四周总结——用原生js封装一个分页器
用原生js封装一个分页器 起因:这次项目还是用原生的js来写的,我负责的是后台,分页是后台最常见的一个功能了,于是干脆封装一下,废话少说,直接上代码 这里是基本的样式 .pagination {display: flex;width: 600px;hei…...
智能AI系统ChatGPT系统源码+支持GPT4.0+支持ai绘画(Midjourney)/支持OpenAI GPT全模型+国内AI全模型
一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...
ARM Linux 基础学习 / 系统相关,文件系统,文件属性
编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料(如 百问网的《嵌入式Linux应用开发完全手册》,在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO:开发板资料》或《2.2 全系列Linux教程…...
nginx https 如何将部分路径转移到 http
nginx https 如何将部分路径转移到 http 我有一个自己的网站,默认是走的 https,其中有一个路径需要走 http。 实现 在 nginx 的配置文件 https 中添加这个路径,并添加一个 rewrite 的指令。 比如我需要将 tools/iphone 的路径转成 http&am…...
算法通关村第八关-白银挑战二叉树的深度和高度问题
大家好我是苏麟 , 今天说说几道二叉树深度和高度相关的题目 . LeetCode给我们造了一堆的题目,研究一下104、110和111三个题,这三个颗看起来挺像的,都是关于深度、高度的。 最大深度问题 描述 : 二叉树的 最大深度 是指从根节点到最远叶子…...
使用LogBack替换Log4j
目录 1.删除log4j有关的依赖,添加logBack依赖 2.删除log4j配置文件,增加logback.xml配置文件 3.更改application.yml配置文件,log文件指向logback.xml 4.重启 1.删除log4j有关的依赖,添加logBack依赖 <dependency><gr…...
财务报告是什么
财务报告是什么 财务报告是企业对外提供的反映企业某一特定日期的财务状况和某一会计期间的经营成果、现金流量等会计信息的文件。 根据财务报告的定义,财务报告具有以下几层含义:一是财务报告应当是对外报告,其服务对象主要是投资者、债权人…...
SOME/IP 协议介绍(四)RPC协议规范
RPC协议规范 本章描述了SOME/IP的RPC协议。 传输协议绑定 为了传输不同传输协议的SOME/IP消息,可以使用多种传输协议。SOME/IP目前支持UDP和TCP。它们的绑定在以下章节中进行了解释,而第[SIP_RPC_450页,第36页]节讨论了选择哪种传输协议。…...
PostgreSQL基础入门
为什么选择PostgreSQL 功能更全面:PGSQL的功能更加全面,支持开窗函数、物化视图、分区表、json等类型,MySQL8以上支持开窗函数、分区表、json等,但物化视图仍不支持。高可用:PG更适合分布式环境,如流复制、…...
Django 密码管理:安全实践与技术深入
在 Web 应用的开发中,密码管理是保障用户安全的关键环节。Django 作为一个强大的 Python Web 框架,提供了一套全面的系统来处理密码的存储、验证和安全。本文将详细探讨 Django 中的密码管理机制,包括密码存储、密码验证、密码安全策略以及自…...
说说你对React Router的理解?常用的Router组件有哪些?
一、是什么 react-router等前端路由的原理大致相同,可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时,页面的显示结果可以根据URL的变化而变化,但是页面不会刷新 因此,可以通过前端路由可以实现单…...
“可一学院”新课程《区块链企业应用》正式上线
2023年8月,上海可一澈科技有限公司启动了一站式区块链学习平台“可一学院BitClass”。9月6日,可一学院正式推出一门新课程《区块链企业应用》,这门课程将帮助学习者了解企业需要什么样的区块链,以及应该如何运用这项技术来推动自身…...
Springboot---整合对象储存服务MinIO
OSS 「OSS」的英文全称是Object Storage Service,翻译成中文就是「对象存储服务」,官方一点解释就是对象存储是一种使用HTTP API存储和检索非结构化数据和元数据对象的工具。 白话文解释就是将系统所要用的文件上传到云硬盘上,该云硬盘提供了…...
HDRP图形入门:HDRP渲染管线depth翻转
新项目开坑HDRP渲染管线,花了些时间把项目开发框架和图形工作流更新到最新版本,其间发现HDRP中深度信息和buildin渲染管线翻转了。 以前的buildin渲染管线,距离摄像机越近depth->0,越远depth->1,这也很好理…...
uniapp——项目02
分类 创建cate分支 渲染分类页面的基本结构 效果页面,包含左右两个滑动区. 利用提供的api获取当前设备的信息。用来计算窗口高度。可食用高度就是屏幕高度减去上下导航栏的高度。 最终效果: 每一个激活项都特殊背景色,又在尾部加了个红条一样的东西。 export d…...
Go语言的Json序列化与反序列化、Goto语法、Tcp Socket通信
目录标题 一、Json序列化与反序列化1. 序列化2. 反序列化 二、Goto语法三、Tcp Socket1. 单客户端发送信息到服务端2. 服务端客户端通信 一、Json序列化与反序列化 1. 序列化 package mainimport ("encoding/json""fmt")type Person struct {Name string…...
gitlab-ce-12.3.5 挖矿病毒及解决方案
前言 最近发现在使用gitlab提交代码的时候总是失败,一访问gitlab还时常报503,于是使用 top 命令查看了内存占用情况,发现了一个git进程内存使用了2.3g,cpu还一直占用300-400%, 以前不知道gitlab还有病毒,只…...
每日一题(LeetCode)----数组--移除元素(四)
每日一题(LeetCode)----数组–移除元素(四) 1.题目([844. 比较含退格的字符串](https://leetcode.cn/problems/sqrtx/)) 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等&…...
421. 数组中两个数的最大异或值/字典树【leetcode】
421. 数组中两个数的最大异或值 给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。 示例 1: 输入:nums [3,10,5,25,2,8] 输出:28 解释:最大运算结果是 5 XOR…...
C++(20):自定义类型实现基于范围的for循环
C自定义类型,可以通过实现begin和end作为成员函数,来支持基于范围的for循环 #include <iostream>class D{ public:int* begin(){return m_data;}int* end(){return m_data 5;} private:int m_data[5]{1, 2, 3, 4, 5}; };int main() {D d;for (in…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
