Pinia Getters 通过响应式计算自动推导总页数:基础写法为 totalPages: (state) => Math.ceil(state.total / state.pageSize) || 0;支持动态 pageSize 切换;多列表场景可用带参 getter 如 (key) => Math.ceil(state[key].total / state[key].pageSize) || 0;需配合 storeToRefs 使用以保障响应式与缓存。

Pinia Getters 处理分页总页数的自动计算,核心是基于当前数据总数(total)和每页条数(pageSize),用响应式、缓存化的方式推导出总页数(totalPages),且能随两者任意变化实时更新。
基础写法:无参 getter 直接计算
适用于 total 和 pageSize 都在 state 中管理的场景:
- state 定义示例:
total: 127, pageSize: 10 - getter 写法:
totalPages: (state) => Math.ceil(state.total / state.pageSize) || 0 - 注意:使用
Math.ceil确保 127 条、每页 10 条 → 得到 13 页;除零时用|| 0防止 NaN
增强写法:支持动态 pageSize 切换
当页面允许用户切换每页显示条数(如 10/20/50),但 total 不变时,可把 pageSize 设为响应式字段,getter 仍保持无参,自动响应:
- state 中包含:
total: 245, pageSize: 20 - getter 不变:
totalPages: (state) => Math.ceil(state.total / state.pageSize) || 0 - 组件中调用
store.totalPages,切换store.pageSize = 50后立即重算为 5
带参 getter:适配多列表共用逻辑
若一个 Store 管理多个分页列表(如用户列表、订单列表),各自有独立的 total 和 pageSize 字段,可用带参 getter 统一复用计算逻辑:
- state 示例:
users: { total: 89, pageSize: 15 }, orders: { total: 212, pageSize: 20 } - getter 写法:
totalPages: (state) => (key) => Math.ceil(state[key].total / state[key].pageSize) || 0 - 调用方式:
store.totalPages('users')→ 6,store.totalPages('orders')→ 11 - 注意:Pinia 不为不同参数值自动缓存结果,高频使用建议配合
lodash.memoize或封装本地缓存
与 UI 联动的关键细节
总页数常用于渲染分页器、禁用“下一页”按钮等,需确保响应及时、不重复触发:
- 避免在模板中写
v-if="Math.ceil(total / pageSize)"—— 这会失去响应式与缓存 - 推荐用
storeToRefs解构:const { totalPages } = storeToRefs(store) - 分页器组件直接绑定
:total="totalPages",Pinia 自动追踪total和pageSize变化 - 若 total 来自异步请求,初始为 0 或 null,getter 中加兜底判断更健壮:
state.total > 0 ? Math.ceil(...) : 0










