node后台分页器

1.背景

因为前端分页数据过大会造成卡顿,所以我们一般会把分页放到后台进行。

2.实现

  1. 查询总页数 (count )
  2. 查询具体页数,从第几页到第几页 (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);
            })
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值