js构造封装-----封装(分页器)(未完待续)

在开发过程中我们往往会遇到分页的情况,这时候虽然插件很香,但是为了提升知识储备和开发能力,结合项目中的分页进行了二次开发。

首先我们依托于三大主流框架中的VUE开发。(如果想要彻底理解实现思路,需要有一定技术了解的方可)

其中红色权入区域为实际分页DOM渲染区域 sk函数式点击显影分页DOM。

其中el:'是要渲染的dom节点'
       end_page : //默认的总页数 实际请求到的总页数在后面会进行替代覆盖
       layer_page : 一次展示几条
       fn :这是一个函数是请求分页接口的回调函数
  th :获取事例对象

page.Go_one是默认点击为一页参数为页数

具体构造函数代码如下

function Fun(data) {
    this.el = document.querySelector(data.el);//获取到的DOM节点
    this.end_page = data.end_page;//总页数
    this.layer_page = data.layer_page;//一次展示几条
    this.Dom_arr = [];//用来存储所有的dom结构
    this.li_arr = [];//用来更新页数的值
    this.fn = data.fn;//获取到数据
    this.th = data.th;//获取真实的事例对象
    this.sjyes = '1 ';
    this.play()
}
Fun.prototype={
    controller : Fun,
    play(){//执行任务
        this.created(this.layer_page);
    },
    created(layer,fn='')   {//创建DOM
        if(typeof fn=='function'){
            fn();
            return
        }
        this.clear_dom();
        this.li_arr = Array.from({length : layer},(v,i)=>i==this.layer_page-1?this.end_page:(i+1==this.layer_page-1?'...':i+1));
        for (let i =0;i<this.li_arr.length;i++)this.el.appendChild(this.CR_DM(this.li_arr[i],i));
    },
    CR_DM(index,i){
        let that = this;
        let div = document.createElement('div');
        div.innerHTML =index;
        this.Dom_arr.push(div);
        div.addEventListener('click',function(){sky(i,that.Dom_arr,that.fn,that,this.th)});
        return div;
    },
    Go_one(page = 1,end_page){//点击传值 然后拿值
        --page;
        sky(page,this.Dom_arr,this.fn,this)
    },
    clear_dom(){//判断并且清除原有的所有DOM结构
        if(this.li_arr.length>1){
            var child = this.el.lastElementChild;
            while (child) {
                this.el.removeChild(child);
                child = this.el.lastElementChild;
            }
        }
    }
};
function sky(index,val,fn,th) {
    if(val[index].innerHTML=='...'){//说明是要加载
        th.Dom_arr = [];
        th.created(th.layer_page,function () {
            let num =  th.li_arr//减去首页
            let nu_ti;//。。。的索引值
            let c_num;//每次点击之后的页数
            let xs = 3;//固定每次是多少
            for (let i in num){
                if(num[i]==='...'&&i>2){//说明是这个拿到上一个值进行删改查
                    nu_ti = i
                }
            }
            c_num = num[nu_ti-1];
            if(+nu_ti+1==num.length-1){//说明是最后一个(做一个过滤)
                if(Math.floor(th.end_page/c_num)>5){//说明数据比较大分页多
                        console.log(c_num)
                }else {//说明数据比较下这时候应该按照百分比
                console.log(c_num)
                }
            }
            xunhn(th,xs)//进去玩去
        });
        return;
    }
    fn(val[index].innerHTML).then(res=>{
        if(th.end_page!=res){
            th.end_page = res;//最后一位是拿到的最新值
            th.Dom_arr = [];//清空所有的DOM结构
            th.created(th.layer_page);//创建新的DOM元素
            th.Go_one(1);//
            return
        }
     val.map((v,i)=>{
            if(i==index){
              return   v.style.background = 'blue';
            }else {
              return   v.style.background = 'red';
            }
        });
    });
}
function xunhn(th,xs) {
   let first = th.li_arr.indexOf('...');
   let end = th.li_arr.lastIndexOf('...');
   if(first!=end){
     let arr =   th.li_arr.splice(first+1 ,end-2);
     let err = arr.map(v=>v+xs);
     th.li_arr.splice(first+1 ,0 ,...err);
    //这里是一种概念
   }else {
       for (let i in th.li_arr){
           if(i>0&&i<end){
               th.li_arr[i] = th.li_arr[i]+xs
           }
       }
       th.li_arr.splice(1,0,'...')
   }
    var child = th.el.lastElementChild;
    while (child) {
        th.el.removeChild(child);
        child = th.el.lastElementChild;
    }
    for (let i =0;i<th.li_arr.length;i++)th.el.appendChild(th.CR_DM(th.li_arr[i],i));
    th.Go_one(3);
}
function Fns() {
    
}

  实际下过如下

 

posted @ 2020-08-25 09:27  熊叔叔  阅读(273)  评论(0编辑  收藏  举报