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

设计一个支持插槽模板的 Vue.js 自定义分页组件,核心在于把渲染权交给使用者,同时把控制权(如跳转、状态同步)清晰地暴露出去。不是写死按钮样式或逻辑,而是让父组件决定“长什么样”和“点它干什么”。
用作用域插槽暴露关键数据和方法
子组件内部不直接处理页面跳转,而是通过 v-slot 向外提供当前页、总页数、跳转函数等必要信息:
- 在分页组件模板中使用
<slot :currentPage="currentPage" :totalPages="totalPages" :goTo="goTo"></slot> - 父组件用
<template #default="{ currentPage, totalPages, goTo }">接收,并自由组织 UI:比如用<el-button @click="goTo(1)">首页</el-button>或自定义数字页码列表 -
goTo(page)应是稳定引用(避免用箭头函数内联定义),否则父组件重渲染时绑定会丢失
保持页码状态双向可控
仅靠插槽暴露还不够,父子组件的页码必须同步:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 子组件用
emit('update:modelValue', newPage)(Vue 2)或defineModel()(Vue 3.4+)通知变更 - 父组件用
v-model:page="current"绑定,既能传入初始值,也能响应子组件的更新 - 当父组件主动调用
goTo(3)时,子组件应同步更新modelValue并触发 emit,避免显示与状态错位
支持常见业务逻辑定制
插槽机制的价值,在于让父组件轻松叠加实际业务需求:
立即学习“前端免费学习笔记(深入)”;
-
防抖跳转:包装
goTo,加setTimeout防止快速连点 -
条件拦截:点击下一页前检查表单是否已保存,未保存则弹窗并
return中断 -
异步加载控制:调用
goTo(newPage)后手动触发fetchData(newPage),而非让分页组件自动发请求 -
键盘支持统一入口:←→键翻页逻辑仍需在子组件内处理,但最终也调用同一个
goTo方法,保证行为一致
注意插槽使用的边界和陷阱
插槽不是万能胶,滥用容易破坏响应式或引发 bug:
- 不要在插槽里直接修改子组件的
ref或内部data,这会绕过响应式系统 - 插槽内容在父作用域编译,所以能访问父组件的
user.name,但访问不到子组件的url属性 - 若需后备内容(如无数据时显示“暂无页码”),可在
<slot>默认文案</slot>中设置

















