管理后台通常需要把权限细化到按钮:没有权限的用户连按钮都不该看到。用自定义指令 v-permission 传入权限码数组,指令内部校验后直接把无权元素移除,比在每个按钮上写 v-if 更统一。
实现思路
mounted 时读取 binding.value 中的权限码列表,与用户权限集合取交集;无权限时调用 removeChild 把元素从页面移除。权限集合可从 Pinia store 读取,也可传入自定义校验函数增强灵活性。
指令代码
// src/directives/permission.js
import { useUserStore } from "@/store/user";
function check(value) {
const store = useUserStore();
const perms = store.permissions || [];
// 传入字符串或数组都兼容
const need = Array.isArray(value) ? value : [value];
return need.every((p) => perms.includes(p));
}
const permission = {
mounted(el, binding) {
if (!check(binding.value)) {
el.parentNode && el.parentNode.removeChild(el);
}
}
};
export default permission;
注册与使用
<!-- main.js 中注册:app.directive("permission", permission) -->
<el-button v-permission="["system/user/add"]" type="primary">
新增用户
</el-button>扩展方向
- 需要禁用而非隐藏时,可改为 el.disabled = true 保留样式占位;
- 权限码来自接口时注意在登录后先拉取再渲染页面,避免指令误删;
- 也可结合路由 meta.permission 与全局前置守卫做整条路由的权限拦截。
小结
v-permission 把权限判定收敛到指令层,模板保持干净,配合服务端二次校验即可实现可靠的按钮级权限控制。
评论(0)
暂无评论,快来抢沙发吧~