Skip to content

usePagination

usePagination 是为传统分页列表场景设计的 Hook,负责处理 页码、总数、加载状态 等逻辑,让你专注于渲染表格或列表。

基础用法

typescript
import { usePagination } from '@yh-ui/request'

interface UserListResult {
  list: User[]
  total: number
}

const {
  current, // 当前页码
  pageSize, // 每页条数
  total, // 总数
  totalPages, // 总页数
  data, // ShallowRef<UserListResult | undefined>
  loading,
  pagination // 分页方法集合
} = usePagination<UserListResult>(
  // service: (page, pageSize) => Promise<RequestResponse<T>>
  (page, size) =>
    request.get('/api/users', {
      params: { page, pageSize: size }
    }),
  {
    defaultPagination: {
      current: 1,
      pageSize: 10
    }
  }
)

模板示例(以 YH-UI Pagination 为例):

vue
<template>
  <yh-table :data="data?.list || []" />

  <yh-pagination
    v-model:current="current"
    v-model:page-size="pageSize"
    :total="total"
    @change="pagination.loadPage"
  />
</template>

返回值

typescript
const result = usePagination<TData, TParams>(service, options)
字段类型说明
currentRef<number>当前页码
pageSizeRef<number>每页条数
totalRef<number>总记录数
totalPagesRef<number>总页数
dataShallowRef<TData | undefined>接口返回数据(通常含 listtotal
loadingRef<boolean>加载中
refreshingRef<boolean>刷新中
loadingMoreRef<boolean>加载更多中(与其他 Hook 联动时使用)
errorShallowRef<unknown>错误
paramsRef<TParams>额外参数
noMoreRef<boolean>是否没有更多数据
pagination.loadPage(page)(page: number) => void加载指定页
pagination.nextPage()() => void下一页
pagination.prevPage()() => void上一页
pagination.firstPage()() => void首页
pagination.lastPage()() => void末页
pagination.refresh()() => void以当前页刷新
pagination.setPageSize(size)(size: number) => void修改每页条数并自动刷新(非 manual 模式)
pagination.setTotal(total)(total: number) => void手动设置总数

选项

usePagination(service, options) 的第一个参数为请求函数 service(page, pageSize, ...args),第二个参数为配置项:

typescript
interface UsePaginationOptions<TData, TParams extends unknown[]> {
  defaultPagination?: PaginationOptions // 默认分页参数 { current, pageSize }
  request?: Request // 自定义请求实例(预留)
  onSuccess?: (data: TData, params: TParams) => void
  onError?: (error: unknown, params: TParams) => void
  onFinally?: (params: TParams) => void
  manual?: boolean // 是否手动触发首次加载
  defaultParams?: TParams // 除 page、pageSize 外的额外参数,如 keyword
}

常见用法:

typescript
const { current, pageSize, total, data, loading, pagination } = usePagination(
  (page, size, keyword: string) =>
    request.get('/api/users', { params: { page, pageSize: size, keyword } }),
  {
    defaultPagination: { current: 1, pageSize: 20 },
    defaultParams: [''], // 第三个参数 keyword
    onSuccess: (res) => {
      console.log('列表加载成功', res)
    }
  }
)

service 的前两个参数固定为 (current, pageSize),后续参数可通过 defaultParams / 手动修改 params 传入。

手动模式(manual)

typescript
const state = reactive({
  keyword: ''
})

const { current, pageSize, total, data, loading, pagination, params } = usePagination<
  UserListResult,
  [number, number, string]
>(
  (page, size, keyword) => request.get('/api/users', { params: { page, pageSize: size, keyword } }),
  {
    manual: true,
    defaultPagination: { current: 1, pageSize: 10 },
    defaultParams: [1, 10, ''] // [page, size, keyword]
  }
)

// 主动加载
const load = () => {
  params.value = [current.value, pageSize.value, state.keyword]
  pagination.refresh()
}

与 useRequest 的区别

  • useRequest:更通用,适用于各种单次请求 / 防抖 / 节流 / SWR 等
  • usePagination:专门处理分页逻辑,更适合「列表 + 分页」这种典型场景

相关 Hook

Released under the MIT License.