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() {
}
实际下过如下

浙公网安备 33010602011771号