自定义 v-permission 控制按钮权限

1. 定义 v-permission 指令

创建一个文件来定义自定义指令,例如 directives/permission.js。

// directives/permission.js
import { useUserStore } from '../store/userStore'; // 假设你有一个存储用户权限的 store
export default {
mounted(el, binding) {
const { value: permissionName } = binding;
// 获取用户的权限列表,假设通过 store 获取
const userStore = useUserStore();
const permissions = userStore.permissions;
if (!permissions.includes(permissionName)) {
el.style.display = 'none'; // 如果没有权限,则隐藏按钮
}
},
updated(el, binding) {
const { value: permissionName } = binding;
const userStore = useUserStore();
const permissions = userStore.permissions;
if (!permissions.includes(permissionName)) {
el.style.display = 'none';
} else {
el.style.display = ''; // 如果有权限,则显示按钮
}
}
};

2. 在主文件中全局注册指令

在主入口文件中(如 main.js),全局注册自定义指令。

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import { createPinia } from 'pinia';
import permission from './directives/permission'; // 导入指令
const app = createApp(App);
const pinia = createPinia();
app.use(pinia);
app.use(router);
// 注册全局指令
app.directive('permission', permission);
app.mount('#app');

3. 使用指令来控制按钮显示

在需要控制按钮显示的地方,使用 v-permission 指令,并传递按钮的 name 作为指令的值。

<template>
<div>
<button v-permission="'edit'" name="edit-button">Edit</button>
<button v-permission="'delete'" name="delete-button">Delete</button>
<button v-permission="'view'" name="view-button">View</button>
</div>
</template>

4. 设置用户权限存储 (假设你使用的是 Pinia)

// store/userStore.js
import { defineStore } from 'pinia';
export const useUserStore = defineStore('user', {
state: () => ({
permissions: ['view', 'edit'], // 示例权限列表,实际可以通过 API 获取并设置
}),
actions: {
setPermissions(permissions) {
this.permissions = permissions;
},
},
});

5. 其它

如果使用 el.style.display = 'none' 来隐藏按钮,用户可以在浏览器的开发者工具(控制台)中手动修改 display 样式来显示按钮。这种方式并不是真正的安全控制,只是简单地在前端隐藏元素。

if (!permissions.includes(permissionName)) {
el.parentNode && el.parentNode.removeChild(el); // 完全移除元素
}

也可以使用v-if

<template>
<div>
<!-- 使用 Pinia 状态或计算属性来控制显示 -->
<button v-if="hasPermission('edit')" name="edit-button">Edit</button>
<button v-if="hasPermission('delete')" name="delete-button">Delete</button>
</div>
</template>
<script setup>
import { computed } from 'vue';
import { useUserStore } from '../store/userStore';
const userStore = useUserStore();
// 使用计算属性来检查权限
const hasPermission = (permissionName) => {
return computed(() => userStore.permissions.includes(permissionName));
};
</script>
posted @   Li_pk  阅读(360)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示