大二第四周总结——用原生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到5
                    if ((i + 1) == this.page) {       //判断当前页是否等于 当前   索引值(索引值从0开始) +  1
                        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 > 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 {        //如果最大页数小于等于5
            for (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;        //申明一个常量接收this
        let 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天的疲惫

有被一次一次的抛弃,再一次一次的振作

有用自己学到的东西解决问题时候的喜悦

更有无数个加一个瞬间把自己从堕落中拉出来

专研自己的热爱

从书中寻找共鸣

去西安看看那富贵迷人眼

看那没被污染前的海

......

一些事情到此完成闭环。

我看到的,我感受的,

回忆太多,可是,经历过的千千万,都抵不过当下这一瞬间的永恒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/135644.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git的分支及标签使用结合全网最详细的情景演示

目录 一git的分支 ⭐⭐ 补充一个拓展知识&#xff1a; 1.1 git分支 1.2 git分支的增删查命令 1.3 情景演示 二.git标签 2.1 分支与标签的关系 2.2 git标签的基本命令 2.3 情景演示 一git的分支 ⭐⭐ 补充一个拓展知识&#xff1a; 软件开发中常见的四个环境&…

jdk21 虚拟线程原理及使用分享

虚拟线程概述 jdk21已于北京时间9月19日21点正式发布, 其中引人注目的就是虚拟线程(Virtual Thread)随之正式发布, 不再是此前jdk19、jdk20中的预览版本。 平台线程&#xff1a;java传统的线程是对系统线程的包装&#xff0c;为了区别于虚拟线程&#xff0c;因此将通过传统方式…

【Git】工作中的留痕:分支及标签的超神搭配

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Git的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Git分支是什么 二.Git分支的使用 1.分…

HTTPS协议

目录 HTTPS概念加密是什么常见加密方式对称加密非对称加密数据摘要&&数据指纹数据签名 HTTP工作过程探究方案一&#xff1a;只使用对称加密方案二&#xff1a;只使用非对称加密方案三&#xff1a;双方都使用非对称加密方案四&#xff1a;非对称加密对称加密中间人攻击 …

常见面试题-JDK和CGLIB动态代理

JDK 动态代理和 CGLIB 动态代理对比 JDK 动态代理只能代理实现了接口的类&#xff0c;而 CGLIB 可以代理未实现任何接口的类。另外CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用&#xff0c;因此不能代理声明为final 类型的类和方法就二者的效率来说&a…

Unbuntu安装、测试和卸载gcc11

GCC 可用于编译 C、C&#xff0c;本文介绍如何 Ubuntu 上安装 gcc11、测试和卸载它。 1. 在Ubuntu 上安装 gcc11 添加工具链存储库 sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test在 Ubuntu 上安装 gcc11 sudo apt install -y gcc-11验证 gcc11 版本 gcc-11 --v…

AI:80-基于深度学习的医学图像分割与病变识别

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新中,…

数据架构与数据模型

数据架构&#xff1a; 待定 数据模型&#xff1a; 数据模型是对现实世界数据特征的抽象&#xff0c;用于描述一组数据的概念和定义。数据模型从抽象层次上描述了数据的静态特征、动态行为和约束条件。数据模型所描述的内容有三部分&#xff0c;分别是数据结构、数据操作和数…

数据结构与算法 | 第四章:字符串

本文参考网课为 数据结构与算法 1 第四章字符串&#xff0c;主讲人 张铭 、王腾蛟 、赵海燕 、宋国杰 、邹磊 、黄群。 本文使用IDE为 Clion&#xff0c;开发环境 C14。 更新&#xff1a;2023 / 11 / 12 数据结构与算法 | 第四章&#xff1a;字符串 字符串概念字符串字符字符…

rocksdb中测试工具Benchmark.sh用法(基准、性能测试)

1.首先要安装db_bench工具&#xff0c;这个工具在成功安装rocksdb之后就自动存在了&#xff0c;主要是在使用make命令之后就成功安装了&#xff0c;详情请见我之前的文章 2.确保成功安装db_bench之后&#xff0c;找到安装的rocksdb目录下面的tools文件夹&#xff0c;查看里面是…

如何让VirtualBox系统使用Ubuntu主机的USB

如何让VirtualBox系统使用Ubuntu主机的USB 当通过 VirtualBox 尝试不同的操作系统时&#xff0c;访问虚拟机中的 USB 驱动器来传输数据非常有用。 安装Guest Additions 自行百度安装Guest Additions的方法&#xff0c;最终的效果如下&#xff1a; 将用户添加到 vboxusers 组…

前端面试题 计算机网络

文章目录 ios 7层协议tcp协议和udp协议的区别tcp协议如何确保数据的可靠http和tcp的关系url输入地址到呈现网页有哪些步骤post和get本质区别&#xff0c;什么时候会触发二次预检GET请求&#xff1a;POST请求&#xff1a;触发二次预检&#xff08;CORS中的预检请求&#xff09;&…

通过结构间比值比较迭代次数

( A, B )---3-30-2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;A有5个点&#xff0c;B全是0&#xff0c;排列组合。让A,B训练集分别有3&#xff0c;4&#xff0c;5&#xff0c;6张图片&#xff0c;统计迭代次数并排序。 先比较图片数量是3和4的情况 n4 迭代次数…

移植LVGL到单片机的一个demo简单介绍

简介 背景&#xff1a; 本文使用的是主控IC为stm32f103zet6, 显示IC为ST7735s&#xff0c;它是128*160的像素&#xff0c;色深为RGB565颜色。 官方虽然说LVGL移植平台只需 64kB 闪存和 8kB RAM 就足以满足简单的用户界面。但我移植到stm32f103c8t6&#xff0c;不管怎么修改配…

【数据结构】入队序列出队序列问题(以21年408真题举例)

题型说明 一般是一个队列&#xff0c;其中一边可以入队&#xff0c;另一边可以入队和出队只可入队的含义是从这个方向是以队列形式存在可以入队和出队表示此边以堆形式存在 怎么分析&#xff1f; 以21年408真题举例 考点分析 出队序列存在两种情况&#xff1a;入之后就出&…

是谁为所欲为,将我的电脑控作己用?

在刚刚发完短篇小杂文《要找事做&#xff0c;我真怕被闲死》的投稿之后&#xff0c;笔者继续浏览社交网站的网页搜索...... 正看到《温州殡仪馆 》《温州动车723事故死亡高 》《 动车脱轨温州事件真正原因》《 浙江平阳县灭门惨案处理结果公布》《 温州厉秀珍死亡 》这一串又一…

从HDFS到对象存储,抛弃Hadoop,数据湖才能重获新生?

Hadoop与数据湖的关系 1、Hadoop时代的落幕2、Databricks和Snowflake做对了什么3、Hadoop与对象存储&#xff08;OSD&#xff09;4、Databricks与Snowflake为什么选择对象存储5、对象存储面临的挑战 1、Hadoop时代的落幕 十几年前&#xff0c;Hadoop是解决大规模数据分析的“白…

Qt开发流程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

SpringBoot整合第三方技术

SpringBoot整合JUnit 名称&#xff1a;SpringBootTest 类型&#xff1a;测试类注解 位置&#xff1a;测试类定义上方 作用&#xff1a;设置JUnit加载的SpringBoot启动类SpringBootTest(classes Springboot05JUnitApplication.class) class Springboot07JUnitApplicationTests…