自定义分页功能(自定义函数做参数,自动调用自定义函数,改变页码等数据)

自定义分页功能,通用函数

今天写一个需求的时候,需要用到分页,然后没有找到合适的就自己写了一个,记录一下,可以直接对接后端接口。不管是element-ui还是bootstrap等等框架都可以使用,只需要传入你的自定义函数和你的数据总数就可以了,也可以自己定义html样式,这部分主要是js代码。

这个是实现效果:
在这里插入图片描述

html

<div class="custom-page">
    <ul class="pagination custom-page-ul">
        <li class="page-item"><a class="page-details" href="#">100</a></li>
        <li class="page-item"><a class="page-details" href="#">10</a></li>
        <li class="page-item"><a class="page-link custom-page-a previous" href="#">上一页</a></li>
        <li class="page-item"><a class="page-link custom-page-a page-head page-active" href="#">1</a></li>
        <li class="page-item"><a class="page-link custom-page-a" href="#">2</a></li>
        <li class="page-item"><a class="page-link custom-page-a page-tail" href="#">3</a></li>
        <li class="page-item"><a class="page-link custom-page-a next" href="#">下一页</a></li>
        <li class="page-item"><a class="page-details" href="#">10</a></li>
    </ul>
</div>

注意:html通过class来区分
上下一页(previous、next),
极限页码(page-head、page-head),
分页相关需要绑定事件的标签(custom-page-a),
选择分页相关类名page-link
css

.page-active{
     background: #409eff !important;
}

css没什么代码,可以自己自定义很简单的

js

<script>

    window.onload = function(){
        initPage(testAjax,10)
    }


       /**
     * 绑定点击事件
     * @param method 调用的方法 需要返回一个total:数据总数
     * @param pageSize 页码
     */
    function initPage(method,pageSize){
        //默认页码
        let nowPage = 1;
        //调用方法
        let total = initPageFirst(method,pageSize);
        let totalPage = initPageNum(pageSize,total);
        document.getElementsByClassName("page-details")[0].text = "共"+total+"条";
        let aEles = document.getElementsByClassName("custom-page-a");
        for(let i=0; i<aEles.length; i++){
            aEles[i].addEventListener("click",function(ele){
                let pageFlag = nowPage;
                switch(ele.target.text){
                    case '上一页' :
                        if(parseInt(nowPage)-1>0){
                            nowPage--;
                        };
                        break;
                    case '下一页' :
                        if(parseInt(nowPage)+1<=totalPage){
                            nowPage++;

                        };
                        break;
                    default:
                        nowPage = ele.target.text;
                }
                if(pageFlag!=nowPage){
                    result = method.call(null,nowPage,pageSize);
                    total = result.total;
                    totalPage = initPageNum(pageSize,total);
                    document.getElementsByClassName("page-details")[0].text = "共"+total+"条";
                }
                renderPage(nowPage,aEles);
            })
        }
    }

    /**
     * 初始化页码数据
     * @param method 自定义请求数据方法 需要返回一个total:数据总数
     * @param pageSize 页大小
     */
    function initPageFirst(method,pageSize){
        //默认页码
        let nowPage = 1;
        //调用方法
        let result = method.call(null,nowPage,pageSize);
        let total = result.total;
        initPageNum(pageSize,total);
        document.getElementsByClassName("page-details")[0].text = "共"+total+"条";
        let aEles = document.getElementsByClassName("custom-page-a");
        renderPage(nowPage,aEles);
        return total;
    }
    /**
     *  查看当前响应元素是否是数字
     */
    function isNum(ele){
        if(ele.className.indexOf('previous')!=-1 || ele.className.indexOf('next')!=-1){
            return false;
        }
        return true;
    }

    /**
     * 获取总页码
     */
    function initPageNum(pageSize,totalPage){
        let page = Math.ceil(totalPage/pageSize);
        document.getElementsByClassName("page-details")[1].text = pageSize + "条/页";
        document.getElementsByClassName("page-details")[2].text = "共"+page+"页";
        return page;
    }

    /**
     * 渲染active样式
     */
    function renderPage(nowPage,aEles){
        let i=0;
        let flag = false;
        while(aEles[i].className.indexOf('next')==-1){
            if(isNum(aEles[i])){
                if(aEles[i].text == nowPage){
                    aEles[i].className += " page-active";
                    flag = true;
                }else{
                    if(aEles[i].className.indexOf(" page-active")){
                        aEles[i].className = aEles[i].className.replaceAll(" page-active","")
                    }
                }
            }
            i++
        }
        if(!flag){
            if(nowPage < aEles[1].text){
                for(let i=1; i<aEles.length-1; i++){
                    if(isNum(aEles[i])){
                        aEles[i].text = nowPage+i-1;
                    }
                }
                document.getElementsByClassName("page-head")[0].className += " page-active";
            }else{
                for(let i=aEles.length-2; i>0; i--){
                    if(isNum(aEles[i])){
                        aEles[i].text = nowPage-(3-i);
                    }
                }
                document.getElementsByClassName("page-tail")[0].className += " page-active";
            }
        }
    }

    /**
     *
     * @param pageNum
     * @param pageSize
     * @returns {total: number}
     */
    function testAjax(pageNum,pageSize){
        return {total:56};
    }
</script>

注意
js需要注意的地方就是,自定义的返回数据的方法对象里,需要有一个total的属性,用来存放总数。testAjax就是自定义的函数,是你自己的请求后端的函数,然后initPage这个函数会调用的你的自定义函数,并且去渲染分页样式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值