usePagination 封装分页状态与请求逻辑,支持 page/size 或 offset/limit 模式、自定义字段名、初始页码及自动加载;useListLoading 在其基础上扩展无限滚动能力,提供 loadMore 等方法。

用 Composition API 编写可复用的分页与列表加载逻辑,核心是把「请求参数管理」「加载状态控制」「数据响应处理」「翻页行为封装」抽离成独立的组合式函数,同时保持对不同 API 结构、分页策略(如 offset/limit 或 page/size)和错误重试的适应性。
封装基础分页状态与请求逻辑
定义一个 usePagination 函数,统一管理当前页码、每页数量、总条数、加载中状态、错误信息等,并暴露刷新、下一页、上一页、跳转等方法:
- 接收配置对象:如
apiFn(实际请求函数)、defaultPageSize=10、autoLoad=true、pageKey='page'(用于适配不同后端字段) - 内部使用
ref管理currentPage、pageSize、list、total、loading、error -
fetch方法负责拼接参数并调用apiFn;支持传入额外参数(如搜索条件),且自动合并到请求参数中 - 返回所有状态 + 方法,不绑定具体业务字段名,便于复用
适配不同分页协议(offset/limit vs page/size)
后端分页方式不同,参数组装逻辑需可配置。在 usePagination 中增加 mode: 'page' | 'offset' 选项:
-
mode: 'page'→ 请求参数为{ [pageKey]: currentPage, [sizeKey]: pageSize } -
mode: 'offset'→ 请求参数为{ offset: (currentPage - 1) * pageSize, limit: pageSize } - 默认从第 1 页开始,但支持初始化时传入
initialPage
支持列表加载与无限滚动场景
再封装一个更高阶的 useListLoading,基于 usePagination 扩展滚动加载能力:
- 暴露
loadMore()方法,自动判断是否已达底部、是否还有更多数据(list.length ) - 内置防重复触发机制(如
loading为 true 时忽略后续调用) - 可选开启「追加模式」:新数据 push 到原 list 后端,而非全量替换(适用于评论流、消息列表)
- 提供
reset()清空列表并回到第 1 页,常用于搜索或筛选后重载
错误处理与用户反馈集成
组合式函数不直接操作 UI,但应提供清晰的错误钩子和状态信号:
- 暴露
retry()方法,重新触发最后一次请求(保留当前参数) - 通过
errorref 呈现错误信息,配合isNetworkError或statusCode辅助判断类型 - 可选传入
onError回调,在错误发生时通知父组件做 Toast 或日志上报 - 加载状态变化(如
loading变为 false)可触发onLoadEnd,方便埋点或动画控制
不复杂但容易忽略的是:保持参数透传灵活性(比如搜索关键词、分类 ID 应作为外部依赖注入,而非硬编码在组合函数里),以及确保响应数据结构解构方式可配置(例如有些接口返回 data.list,有些是 data.items)。把这些细节做成选项,组合式函数才能真正跨项目复用。


















