vue实现按钮权限控制

需求

管理端设置页面浏览权限和按钮使用权限,如果用户没有某个按钮的权限,则隐藏该按钮。

实现原理

主要方式是在el-button按钮上设置标签数值,利用vue的指令功能获取按钮实例对象和按钮上绑定的标签数值,与从接口拿到的按钮权限列表进行匹配,如果匹配成功,证明用户拥有该按钮的使用权限,如果发现没有使用权限,则在指令处理函数中编写代码移除该按钮,界面上就看不到该按钮了。

代码

src/directive/permission/hasPermi.js

import store from '@/store'

export default {
// inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  inserted(el, binding, vnode) {
    const { value } = binding
    const all_permission = "*:*:*";
    const permissions = store.getters && store.getters.permissions

    if (value && value instanceof Array && value.length > 0) {
      const permissionFlag = value

      const hasPermissions = permissions.some(permission => {
        return all_permission === permission || permissionFlag.includes(permission)
      })

      if (!hasPermissions) {
        el.parentNode && el.parentNode.removeChild(el)
        // 或者:el.style.display = 'none'
      }
    } else {
      throw new Error(`请设置操作权限标签值`)
    }
  }
}

src/directive/index.js

import hasPermi from './permission/hasPermi'

const install = function(Vue) {
  Vue.directive('hasPermi', hasPermi)
}

if (window.Vue) {
  window['hasPermi'] = hasPermi
  Vue.use(install); // eslint-disable-line
}

export default install

main.js

import Vue from 'vue'
import directive from './directive' // directive
Vue.use(directive)

权限列表参考:
在这里插入图片描述

### Vue3 按钮级别权限控制实现方式 在 Vue 3 中,可以通过自定义指令或者组合式 API 的方式来实现按钮级别的权限控制。以下是两种常见的方法及其具体实现。 #### 方法一:使用自定义指令 通过创建一个全局指令 `v-permission`,可以动态判断用户的权限并控制 DOM 元素的渲染状态。 ##### 自定义指令的核心逻辑 当用户尝试访问受控元素时,该指令会对比当前用户的权限列表与指定的权限需求。如果匹配成功,则允许显示;否则隐藏该元素[^2]。 ```javascript // 定义 v-permission 指令 import { createApp } from 'vue'; const app = createApp({}); app.directive('permission', { mounted(el, binding) { const userPermissions = ['dashboard:view', 'user:edit', 'order:create', 'setting:view']; // 假设这是从后端获取的用户权限列表 if (binding && Array.isArray(binding.value)) { const hasPermission = binding.value.every(permission => userPermissions.includes(permission)); if (!hasPermission) { el.parentNode && el.parentNode.removeChild(el); // 如果无权则移除节点 } } else { throw new Error('Binding value must be an array of permissions'); } }, }); ``` ##### 使用示例 在模板中应用此指令即可完成权限校验: ```html <template> <button v-permission="['user:edit']">编辑</button> <!-- 只有拥有 user:edit 权限的人才能看到 --> <button v-permission="['order:create', 'setting:view']">高级设置</button> <!-- 需要同时具备两个权限 --> </template> <script> export default {}; </script> ``` --- #### 方法二:利用计算属性配合条件渲染 另一种更灵活的方式是借助 Vue 的响应式特性,在组件内部维护一份权限数据,并结合 `v-if` 或其他条件语句进行展示控制。 ##### 计算属性验证逻辑 通过封装一个通用的方法用于检测特定权限是否存在,从而简化视图层的复杂度[^1]。 ```javascript // 组件中的 script 部分 export default { data() { return { userPermissions: ['dashboard:view', 'user:edit', 'order:create'], // 示例权限列表 }; }, methods: { checkPermission(permissionsArray) { if (!Array.isArray(permissionsArray)) { console.error('checkPermission: 参数必须是一个数组!'); return false; } return permissionsArray.every(permission => this.userPermissions.includes(permission)); // 判断是否全部满足 }, }, }; ``` ##### 页面结构实例 将上述函数应用于实际场景下: ```html <template> <div> <button v-if="checkPermission(['user:edit'])">编辑</button> <button v-if="checkPermission(['order:create', 'setting:view'])">高级设置</button> </div> </template> ``` 这种方法的优势在于它不依赖于额外的插件或复杂的配置过程,适合小型项目快速集成。 --- ### 总结 无论是采用 **自定义指令** 还是 **计算属性加条件渲染** 的方案,都可以有效达成 Vue3 下的按钮级权限管理目标。前者更适合追求代码简洁性和复用性的开发者,而后者提供了更大的灵活性供业务逻辑扩展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值