SwPagination

SwPagination 是页码翻页器:受控 v-model:page,页码切换后由父层整组替换列表数据(替换式)——与 SwGallery 的 @load-more(追加式)是两套互斥的数据流,按场景选一种,不要混用。

响应式是纯 CSS media query 双形态:桌面完整版(页码窗口 + 省略号 + 跳转 + 总数)与移动简化版(上一页 N / M 下一页)同时渲染、按断点显隐(768px,对齐 framework)——无 JS 测宽,SSR 无 hydration 风险。

基础分页(total/pageSize 算页数 + 共 N 条)

加载中...

与 SwGallery 组合(页码翻页场景)

网格 + 页码 = loadMode="none" 的 SwGallery + 本组件;页码变化时整组替换 items:

SwGallery(none)+ SwPagination 组合换页

加载中...
<script setup lang="ts">
const page = ref(1)
const { data } = await useAsyncData(
  () => `list-${page.value}`,
  () => request<MovieList>('/movie/list', { body: { page: page.value, page_size: 24 } }),
  { watch: [page] },
)
</script>

<template>
  <SwGallery :items="data?.list ?? []" load-mode="none">
    <template #default="{ item }">…</template>
  </SwGallery>
  <!-- 旧协议数字下发 string:一行 + 号归一 -->
  <SwPagination v-model:page="page" :page-count="+(data?.last_page ?? 1)" :total="+(data?.total ?? 0)" show-total />
</template>

定制

pageCount 直传 + 窗口 7 + 自定义箭头 + disabled 加载锁

加载中...

maxVisible 窗口折叠 + showTotal

加载中...

disabled 加载锁(防连点)

加载中...

Props

名称类型必填默认值说明
page(v-model)number✓—当前页码(从 1 开始,受控)
totalnumber0条目总数,与 pageSize 算总页数
pageSizenumber20每页条数
pageCountnumberundefined总页数直传(后端直给 last_page),优先于 total 计算
maxVisiblenumber5页码窗口宽(建议奇数),超出折叠省略号
showJumperbooleantrue桌面端「前往 N 页」跳转输入(回车提交,越界 clamp)
showTotalbooleanfalse「共 N 条」文案(需传 total)
disabledbooleanfalse整体禁交互(加载中)
ariaLabelstring'分页'<nav> 的 aria-label

Events

名称携带说明
update:pagepage: number页码变化(同页 / 越界 / disabled 不触发)

Slots

名称说明
prev / next自定义上 / 下一页内容(默认内联 SVG 箭头)

样式定制 Token

以下 CSS 变量可在业务侧覆盖(fallback 即默认值):

变量默认值说明
--sw-pagination-gap0.25rem页码之间的间距
--sw-pagination-item-size2rem单个页码的最小宽高(正方形热区)
--sw-pagination-item-padding0.375rem页码内边距(页数变多时撑宽用)
--sw-pagination-font-size0.875rem页码字号

注意事项

  • 总页数 ≤ 1 时整体隐藏(无可翻内容不渲染)。
  • 替换式 vs 追加式:要无限滚动 / 加载更多请用 SwGallery 的 loadMode,不要拿页码模拟。
  • ISR 页面的翻页用 URL 承载页码(RESTful 路径如 /list/page/2 或 GET query),让缓存 key 区分页码——v-model:page 绑路由参数即可。

相关