前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我因无法回答如何用Vue控制按钮级别权限,面试官说:你可以回家了

我因无法回答如何用Vue控制按钮级别权限,面试官说:你可以回家了

作者头像
前端达人
发布2023-08-31 09:18:48
2490
发布2023-08-31 09:18:48
举报
文章被收录于专栏:前端达人
在最近的一次面试中,有一位面试官问我如何在Vue项目中控制按钮级别的权限。起初,我建议使用`v-if`,但面试官表示这并不是一个足够好的解决方案。

我提到我们的项目不需要过多的按钮级权限控制,所以`v-if`似乎足够了。

然而,面试官强调了更加多才多艺的方法的重要性。最终,他们的反馈是,虽然我在各个方面都有经验,但我的知识深度还有待提高。

如何控制按钮级别的权限?

让我们来探索一下Vue Vben Admin项目中如何处理按钮级别的权限。这是一个在GitHub上拥有16.2k颗星的热门后台管理系统。

获取许可代码

为了实现权限控制,我们需要权限代码(或角色代码)。

通常情况下,后端程序提供一个代码,成功登录后,该代码会被全局存储。通常,在登录后,该代码会被获取并存储在全局存储(Vuex或Pinia)中。

代码语言:javascript
复制
import { defineStore } from 'pinia';

export const usePermissionStore = defineStore({
   state: () => ({
     permCodeList: [], // List of permission codes
   }),
  
   getters: {
     getPermCodeList() {
       return this.permCodeList;
     },
   },
  
   actions: {
     setPermCodeList(codeList) {
     this.permCodeList = codeList;
   },
  
   async changePermissionCode() {
     const codeList = await getPermCode();
     this.setPermCodeList(codeList);
   }
});

接下来,有三种方法来控制按钮级别的权限。让我们仔细看看每种方法。

方法一:函数方法

您可以使用函数方法来使用`v-if`指令来控制权限。核心逻辑封装在`hasPermission`函数中:

代码语言:javascript
复制
<template>
 <a-button v-if="hasPermission(['20000', '2000010'])" color="error" class="mx-4">
   Visible with codes [20000, 2000010]
 </a-button>
</template>
<script>
 import { usePermission } from '/@/hooks/web/usePermission';

 export default defineComponent({
   setup() {
     const { hasPermission } = usePermission();
     return { hasPermission };
   },
 });
</script>

方法二:组件方法

Vue Vben Admin还提供了一个`Authority`组件用于权限控制:

代码语言:javascript
复制
template>
 <div>
   <Authority :value="RoleEnum.ADMIN">
     <a-button type="primary" block> Visible only for admin role </a-button>
   </Authority>
 </div>
</template>
<script>
 import { Authority } from '/@/components/Authority';
 import { defineComponent } from 'vue';
 export default defineComponent({
   components: { Authority },
 });
</script>

`Authority` 组件使用 `hasPermission` 函数来确定是否渲染包装的内容。

方法三:自定义指令

第三种方法涉及使用名为 `v-auth` 的自定义指令:

代码语言:javascript
复制
<a-button v-auth="'1000'" type="primary" class="mx-4">
  Visible with code ['1000'] </a-button>

该指令根据权限代码控制元素的可见性。

每种方法都依赖于`hasPermission`函数,该函数检查用户的权限代码是否与所需代码匹配。Vue Vben Admin通过利用`updated`生命周期钩子和`watchEffect`来重新渲染按钮,以解决动态更新限制。

值得注意的是,Vue Vben Admin提供的解决方案存在一定的局限性,例如无法动态更改按钮权限,也无法响应用户权限的动态变化。解决这些限制需要进一步的考虑和探索。

结论

虽然提供的解决方案提供了有效的按钮级别权限控制,但面试官可能正在寻找更高级和更优雅的方法。我欢迎那些在这个领域更有经验的人提供任何见解和指导。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取许可代码
  • 方法一:函数方法
  • 方法二:组件方法
  • 方法三:自定义指令
  • 结论
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档