后端给了我一大堆数据,让我自己做前端分页。。。

580 阅读2分钟

项目里只要用到分页,就会想到使用各种UI框架里的pagination组件。
由于每次分页功能一般是后台实现,前端请求就完事了。没让我想到过这个分页到底是怎么实现的。
直到我现在需要开发一个网页单页面,直接给了我一大堆数据,让我自己做分页,我才发现,原来分页是要区分成前端分页后端分页的。

  • 前端分页:一次性拉取全部数据,前端对所有数据进行分页显示。

    • 缺点:下载量大,显示慢,加载时用户体验不好。如果有即时性内容,就不能翻回来的时候更新了。
    • 优点:服务器压力请求少,换页时用户体验好。
  • 后端分页:后端对数据划分为若干页,前端每次只拉取一页数据并显示。

    • 缺点:每次换页都需要访问后端,加重服务器的压力,换页时显示慢。
    • 优点:不用一次性拉取所有数据,显示快,用户体验较好。

下面以el-pagination为例。

<div v-for="(item,index) in listData" :key="index">
    <span>{{item.title}}</span>
</div>
<el-pagination
  layout="prev, next"
  @current-change="change"
</el-pagination>

以前的需求,一直在做后端分页。当换页时会回调change返回新的页码,利用新的页码向服务端请求该页数据即可实现分页。

<script>
    change(currentPage) {
        this.pageBean.pageNo = currentPage;
        this.getData(
            this.paramMethod({//根据页码调用后端的接口,前端每次只拉取一页数据listData
                pageNo: this.pageBean.pageNo,
                pageSize: this.pageBean.pageSize,
                ...//后端所需要的入参
            })
        );
    },
</script>

那如果需要做前端分页的时候,就需要在change方法中单独处理了,思路也是将所有数据根据页码获取到单页所应该展示的数据。。

假如我们现在每页需要展示5条数据,一共有好多条。 那么首先,在刚进入页面时,需要给listData赋值前5条数据。

this.listData = this.details.slice(0, 5);

然后在每次点击切换页面的时候,重新给listData赋值相应的数据。

<script>
    change(currentPage) {
      const data = this.details;
      this.listData = data.slice((currentPage - 1) * 5, currentPage * 5);
    },
</script>

这样就实现了,上面listData就是本页应该展示的数据。

这个需求让我想到了一个热梗,当后端一次性给你10w条数据,前端该怎么优雅地处理并展示

SCR-20221115-ev7.png

所幸,这次需求的总数据量没那么多。。。哈哈哈