VUE自定义封装权限指令

  • 说明:在一般的后台管理项目中都需要权限管理,有一些权限管理可以通过动态路由进行实现,但是还有一些权限管理是需要我们对页面的按钮或者其他元素进行限制,这时候就用到了权限指令。

自定义指令介绍

注册方法

Vue.directive('my-directive', {
  bind: function () {},
  inserted: function () {},
  update: function () {},
  componentUpdated: function () {},
  unbind: function () {}
})

钩子函数

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。
  • unbind:只调用一次,指令与元素解绑时调用。

钩子函数参数说明

  • el:指令所绑定的元素,可以用来直接操作 DOM。
  • binding:一个对象,包含以下 property:
    • name:指令名,不包括 v- 前缀。
    • value:指令的绑定值,例如:v-my-directive=“1 + 1” 中,绑定值为 2。
    • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    • expression:字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。
    • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 “foo”。
    • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
  • vnode:Vue 编译生成的虚拟节点。
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

好了,基础说完了我们来看看权限指令到底该如何封装

权限指令的封装

// 在permission.js 中
import store from './store'

/**
 * 判断当前用户是否拥有某项权限权限
 * @param {*} key 权限名称
 */
function checkArray (key) {
  const roles = store.getters.user.resoucesFlagList // 获取用户的全部权限
  const index = roles.indexOf(key)
  if (index > -1) {
    return true
  } else {
    return false
  }
}

/**
 * Action 权限指令
 * 指令用法:
 *  - 在需要控制 action 级别权限的组件上使用 v-action:[method]
 *  - 说明:[method] 为当前资源的权限标识
 *  - 例如:
 *    <el-button v-action:addUser >添加用户</el-button>
 *  - 当前用户没有权限时,组件上使用了该指令则会被隐藏
 */
const action = Vue.directive('action', {
  inserted (el, binding) {
    const actionName = binding.arg // 得到 v-action传递过来的值
    if (actionName) {
     // 判断当前用户是否拥有该权限,每个项目业务不同,判断用户是否拥有权限的方法也不同,
     // 我司采用的是将用户拥有的所有权限保存在vuex中,在使用权限指令时把元素所需要的权限传递过来,
    // 然后在vuex中查找用户是否拥有该权限,如果有就显示该元素,否则移除该元素
      const hasPermission = checkArray(actionName)
      if (!hasPermission) { // 没有权限
        el.parentNode && el.parentNode.removeChild(el)
      }
    }
  }
})

export { action }
// 最后再在Vue项目的入口文件main.js中导入permission.js
Vue3 中,你可以通过自定义指令或组件的方式来封装权限菜单和权限按钮。 1. 自定义指令 你可以通过自定义指令来实现权限按钮的封装。例如,你可以创建一个名为 `v-permission` 的指令,然后在需要控制权限的按钮上使用该指令。在指令中,你可以通过判断用户是否拥有相应的权限来控制按钮的显示或隐藏。 示例代码: ```vue <template> <button v-permission="'edit'">编辑</button> </template> <script> export default { directives: { permission: { mounted(el, binding) { const permission = binding.value; const hasPermission = checkPermission(permission); if (!hasPermission) { el.style.display = 'none'; } } } } } </script> ``` 2. 组件 你也可以通过组件的方式来封装权限菜单和权限按钮。例如,你可以创建一个名为 `PermissionMenu` 的组件,然后在该组件中根据用户是否拥有相应的权限来动态生成菜单。 示例代码: ```vue <template> <ul> <li v-for="item in menu" :key="item.path"> <router-link v-if="hasPermission(item.permission)" :to="item.path">{{ item.title }}</router-link> </li> </ul> </template> <script> export default { data() { return { menu: [ { path: '/', title: '首页', permission: 'home' }, { path: '/user', title: '用户管理', permission: 'user' }, { path: '/role', title: '角色管理', permission: 'role' } ] } }, methods: { hasPermission(permission) { return checkPermission(permission); } } } </script> ``` 无论是自定义指令还是组件,都需要在代码中实现权限的判断逻辑,以保证权限的正确控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值