3 步跑通 vue-vben-admin 组合式函数 Hooks:分页、水印与标签页控制
【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. It's fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin
列表页数据太多只能整屏滚动、敏感页面截屏外泄没人能追责、页签多了用户自己理不清——这类问题在 vue-vben-admin 里不用从零造轮子,@vben/hooks组合式函数模块直接提供现成解法:一个usePagination搞定数据切页,一个useWatermark铺满屏幕水印,一组useTabs方法接管页签行为,几行代码就能落地。
它适合谁 / 解决什么
- 表格动辄上千行,需要纯前端把数据切成一页页展示、翻页不卡顿;
- 财务报表、权限配置这类敏感页面,要求截屏上带账号水印;
- 列表页里要程序化关闭、刷新、置顶页签,而不是只能点右上角菜单。
以上能力都集中在 packages/effects/hooks/ 一个包里,全部以组合式函数(composable)形式导出。
动手前先看这几点
- 环境:Node + pnpm 工作区,仓库自带多应用结构,建议直接在
playground应用里试; - 依赖:
@vben/hooks是内部包(packages/effects/hooks),各应用已在package.json中声明,无需额外安装,版本以仓库实际代码为准; - 关键目录:源码在
packages/effects/hooks/src/,示例页面放playground/src/views/下; - 使用方式:它不是 Vue 插件,不做全局注册,按需
import即可。
最小闭环:从安装到看到结果
这一步在做什么:启动开发环境,验证 hooks 包已经可用。
pnpm install pnpm dev:playground这一步在做什么:新增一个演示页面,把 1000 条数据按每页 20 条切开。文件放playground/src/views/demo/hook-pagination.vue(路由按你的菜单配置挂载)。
<script setup lang="ts"> import { ref } from 'vue'; import { usePagination } from '@vben/hooks'; const list = ref(Array.from({ length: 1000 }, (_, i) => ({ id: i + 1 }))); const { paginationList, currentPage, total, setCurrentPage, setPageSize } = usePagination(list, 20); function consolePage() { console.log(paginationList.value, currentPage.value, total.value); } </script> <template> <div> <button @click="consolePage">打印当前页</button> <ul> <li v-for="item in paginationList" :key="item.id"> 第 {{ item.id }} 条 </li> </ul> <button @click="setCurrentPage(currentPage + 1)">下一页</button> </div> </template>这一步在做什么:点按钮验证切页结果。你会看到控制台依次输出 20 条记录、页码1、总数1000;点“下一页”再打印,页码变2,首条记录的id从21开始。
能力卡片
usePagination
- 定位:纯前端数组切页,返回当前页数据与页码。
- 时机:数据量中等、后端没提供分页接口时。
- 关键代码:
const { paginationList, currentPage, setCurrentPage } = usePagination(list, 20);useWatermark
- 定位:给页面铺带内容的网格水印,支持动态更新。
- 时机:敏感页面防截屏外泄、内部系统标识环境。
- 关键代码:
const { initWatermark, destroyWatermark } = useWatermark(); initWatermark({ content: '内部系统 · admin', globalAlpha: 0.2 });useTabs
- 定位:程序化操作页签:关闭、刷新、置顶、新窗口打开。
- 时机:业务代码需要接管页签行为时。
- 关键代码:
const { refreshTab, closeAllTabs } = useTabs(); await refreshTab();useHoverToggle
- 定位:监听元素悬停,进入/离开各自带延迟。
- 时机:悬停浮层、跟随提示等需要防抖的交互。
- 关键代码:
const [hovered, { disable }] = useHoverToggle(cardRef, { enterDelay: 100, leaveDelay: 400, });落地案例:以用户管理模块为例
需求:用户管理页约 3000 条记录要分页浏览,管理员进入时页面铺水印,操作完成后把该页签刷新一次。
数据请求回来后先交给usePagination(list, 20),模板只渲染paginationList;页码、总数随数据自动变化,后端返回的新数据比当前页还短时,currentPage会自动回到 1,不会出现空白页。
进入页面调用initWatermark({ content: 'admin · 用户管理' }),整个视口出现斜向网格水印;离开后依赖组件卸载钩子自动销毁,不留残留。
点击“保存”成功后await refreshTab(),当前页签原地刷新,用户无感知。预期效果:翻页流畅、截屏带账号、页签状态与数据保持一致,三件事各由一个 hook 承担,互不干扰。
常见坑与排查
Q:后端换了新数据,列表空白或页码越界? A:usePagination默认在数据总数变化时把currentPage重置回 1;若你传了第三个参数false关闭该行为,就要自己在请求成功后调用setCurrentPage(1)。
Q:为什么换每页条数要调setPageSize,不能直接改自己的 ref? A:setPageSize内部会把页码重置回 1,避免旧页码超出新的总页数范围;直接改外部变量不会触发这个保护逻辑。
Q:水印在切换路由后没消失? A:useWatermark只在首次调用时注册卸载钩子,防止路由切换时误销毁。如果你希望水印随某个组件销毁,需要在合适时机手动调用destroyWatermark。
Q:要在main.ts里app.use注册一下吗? A:不需要。@vben/hooks是普通组合式函数集合,没有插件入口,在任意组件的<script setup>里导入即用。
下一步
- 对照源码通读 use-pagination.ts 与 use-watermark.ts 的实现;
- 把你项目里一个手写分页表格迁移到
usePagination,对比代码量; - 给一个敏感页面加上
useWatermark,验证卸载后水印确实消失。
相关入口:hooks 包源码、playground 示例页面目录
【免费下载链接】vue-vben-adminA modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. It's fast!项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-admin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考