3 步跑通 vue-vben-admin 组合式函数 Hooks:分页、水印与标签页控制
2026/9/2 22:33:29 网站建设 项目流程

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,首条记录的id21开始。

能力卡片

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.tsapp.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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询