1.背景
因为前端分页数据过大会造成卡顿,所以我们一般会把分页放到后台进行。
2.实现
- 查询总页数 (count )
- 查询具体页数,从第几页到第几页 (top/limit =>mysql用limit)
3.想法
对于后台分页,我是这样想的,因为查询页数总数其实是一个很耗费时间的行为,我们应该尽量避免这种消耗。因此,我会在第一次请求的时候,给前台返回总页数。之后的每一次请求返回相应的页数。那么就会出现一个问题,就是如何判断是第一次请求呢?
- req.session[“page”]存储总页数的值
但是这就会存在一个问题,因为前端路由跳转和后台无关,req.session只会在第一次的分页请求中,返回分页的页数,之后不管我页数如何更新,req.session[“page”]的值都不会改变。除非在每一次有周报提交操作的时候更新req.session["page“]的值,但是req.session[“page”]的值原先是不存在的,如果我们还要判断存在与否再选择更新,那其实是有点赘余的一个操作
- 前端存储总页数
在组件的date值中用totalPage存储总页数,一开始置为null,把totalPage和第几页,每页多少内容一起发给后台
let msg = {
"totalPage":this.totalPage,
"pageParams":{
"page":this.page,
"pageSize":10
}
};
类似于这样的格式,然后后台收到的totalPage的值为null,那么说明是第一次,则查询总页数,第一页的值,内容,返回给前台,并且把返回的总页数的值赋给totalPage。否则只返回页数和相应的内容。由于date在每一次组件重新渲染的过程中都会被初始化,这样就不会发生,页数和周报不同步的问题了。
4.源码
allTasks(pool){
return function(req,res){
console.log("所有:")
console.log(req.body);
let msg = req.body;
let pageParams = msg.pageParams;
let data;
let arr = [];
let selectSql = myselfSql.select('content left join user on content.user_id=user.user_id',"content.user_id,content.weekly_taskData,user.user_learningDirection,user.user_name,content.weekly_id","content.user_id<>"+req.session.id+" and content.weekly_flag = 0 and user.user_learningDirection='"+req.session['learningDirection']+"'order by content.weekly_taskData desc limit "+(pageParams.page-1)*pageParams.pageSize+","+pageParams.pageSize);
arr.push(selectSql);
if(!msg.totalPage){//是第一次请求
let countSql = myselfSql.select('content left join user on content.user_id=user.user_id','count(*)',"content.user_id<>"+req.session.id+" and content.weekly_flag = 0 and user.user_learningDirection='"+req.session['learningDirection']+"'order by content.weekly_taskData desc");
arr.push(countSql);
}
Promise.all(poolP.poolPromise(pool,arr)).then(result=>{
console.log(result);
data = {
msg:"获取成功",
code:2000,
success:true,
tasks:result[0]
}
if(!msg.totalPage){
data.totalPage = Math.ceil(result[1][0]["count(*)"]/pageParams.pageSize);
// console.log(data);
}
res.send(JSON.stringify(data));
}).catch(err=>{
console.log(err);
})
}
}