Vue分页组件通过作用域插槽暴露currentPage、totalPages和goTo方法,将跳转控制权交由父组件;配合v-model双向同步页码状态,并支持防抖、拦截、异步加载等自定义逻辑。

在 Vue 分页组件中,用 slots 实现自定义跳转逻辑,核心不是“替换按钮”,而是“把跳转控制权交出去”——父组件决定点某区域时做什么,子组件只负责渲染和触发事件。
用作用域插槽(scoped slot)暴露当前页、总页数、跳转方法
分页子组件内部不硬编码跳转逻辑,而是通过 v-slot 向外提供必要数据和可调用函数:
- 把
currentPage、totalPages、goTo(page)封装进插槽属性传给父组件 - 默认插槽可渲染基础页码,但所有交互行为由父组件接管
- 例如:父组件里写
<template currentpage totalpages goto></template>,就能直接用goTo(5)或绑定到自定义按钮上
配合 v-model 或 emit 实现双向可控的页码同步
单纯插槽暴露方法还不够,页码状态需保持父子一致:
- 子组件用
defineModel()(Vue 3.4+)或emit('update:modelValue', newPage)同步变更 - 父组件用
v-model:page="current"绑定,既接收变化,也支持初始值注入 - 当父组件自己调用
goTo(3)时,子组件应更新显示并触发同步,避免状态错位
自定义跳转逻辑的典型场景与写法
真正灵活的地方在于父组件可自由组合逻辑,比如:
立即学习“前端免费学习笔记(深入)”;
-
防抖跳转:包装
goTo,加setTimeout防止快速连点 - 条件拦截:点击下一页前检查表单是否已保存,未保存则弹窗提示并阻断
-
异步加载控制:调用
goTo后手动触发fetchData(newPage),而非让分页组件自动发请求 - 动画过渡:跳转前播放 loading 动画,完成后才更新页面内容
避免常见陷阱
用 slots 做跳转定制容易踩坑:
- 别在插槽里直接修改子组件的
ref或state,破坏响应式边界 - 插槽函数如
goTo必须是稳定引用(用ref或computed包裹),否则父组件重渲染会导致绑定丢失 - 如果支持键盘翻页(如按 ← → 键),这些事件仍需在子组件内处理,并调用同一份
goTo,保证逻辑统一


















