用 Composition API 和 Hook 做前端权限控制
前端里的权限控制,真做起来通常没标题里看上去那么'优雅'。按钮能不能点、字段该不该显示、菜单要不要出现在侧边栏,最后都要落到一个很朴素的问题上:当前用户到底有没有这个权限。
把这些判断散在组件里,短期最省事,后面就开始难受了。一个页面改三处,另一个页面再复制一遍,权限规则一变,维护成本会很快冒出来。把它收进自定义 Hook,或者 Vue 3 的 Composition API 里,收益主要不是'高级',而是代码终于能收口。
先看目标
这类封装通常不是为了追求抽象本身,而是为了把同一套判断逻辑统一起来:
- 按钮级权限控制
- 字段级权限控制
- 菜单权限控制
如果你的项目里权限规则还会跟角色、路由、数据范围一起变化,那就更需要一个统一入口,不然组件层会越来越脏。
自定义权限 Hook 的思路
所谓自定义权限 Hook,本质就是把'判断权限'这件事独立出来。它通常会做三件事:
- 从状态管理里取出当前用户的权限列表
- 提供一个或几个判断函数
- 在权限变化时保持响应式更新
这套东西不复杂,但很值钱。因为它解决的不是算法问题,而是项目里最常见的重复劳动。
Vue 3:用 Composition API 封装 usePermission
先说一个最常见的版本:只根据权限标识做判断。
// hooks/usePermission.js
import { computed } from 'vue';
import { usePermissionStore } from '@/stores/permission';
export function usePermission() {
const permissionStore = usePermissionStore();
// 封装权限判断函数
const hasPermission = (permission) => {
return permissionStore.permissions.includes(permission);
};
// 支持多权限判断
const hasAnyPermission = (permissions) => {
return permissions.some((perm) => permissionStore.permissions.(perm));
};
{ hasPermission, hasAnyPermission };
}

