路由守卫不处理按钮级权限,仅控制页面跳转;按钮权限由自定义指令v-permission实现,通过比对用户权限数组与指令传入的权限码(如['user:delete'])决定按钮显隐,确保页面内操作入口精细化控制。

路由守卫本身不直接处理按钮级权限,它的职责是控制页面跳转,而不是控制页面内元素的显隐。按钮级权限需要配合自定义指令 + 权限数据,在 DOM 渲染阶段做判断。
按钮权限的核心逻辑:靠指令,不是守卫
用户进入某个页面后,页面已渲染,此时路由守卫早已执行完毕。按钮是否显示、是否可点击,取决于当前用户是否拥有对应操作权限(如 user:delete、order:export)。这个判断必须在组件挂载或更新时实时进行,因此采用 Vue 自定义指令是最自然、解耦性最好的方式。
典型实现思路是:
- 登录后从后端获取用户全部权限标识(字符串数组,如 ['user:view', 'user:edit', 'order:list'])
- 将该权限列表存入 Pinia/Vuex 或 localStorage(注意:仅作前端展示控制,关键操作仍需后端鉴权)
- 定义 v-permission 指令,接收权限码数组作为参数
- 指令内部比对当前用户权限是否包含任一传入码,决定是否隐藏按钮
自定义指令示例(Vue 3 + Pinia)
在 src/directives/permission.ts 中:

