Skip to content

指令 ​

在 src/directive 下定义了自定义指令,经 directive/index.ts 通过 import.meta.glob 自动注册(在 src/directive 下新建指令文件即可生效,无需手动接线)

项目内置指令 ​

权限相关 ​

v-hasRole 当前登录用户拥有指定角色才进行dom元素加载

<a-button v-hasRole="['ROLE_admin','ROLE_manager']"> 查 询 </a-button>

v-hasPermission当前登录用户拥有指定权限才进行dom元素加载

<a-button v-hasPermission="['system:user:add']"> 查 询 </a-button>

实现说明:指令在 mounted 钩子中比对 userStore 中的 roleCodes / permissions 集合,传入数组中存在任一未持有的编码即执行 el.remove() 将元素从 DOM 中移除。注意元素移除发生在挂载时,不支持响应式切换;参数必须为字符串数组,否则控制台报参数错误

export default (app:App<Element>):void => {
  app.directive('hasPermission',{
    mounted: (el, binding) => {
      const currentPerms = cloneDeep(userStore.$state.permissions)
      const value = binding.value
      if (Array.isArray(value)) {
        if (value) {
          for (const permission of value as string[]) {
            if (!currentPerms.includes(permission)) {
              el.remove()
              break
            }
          }
        }
      } else {
        console.error('v-hasPermission 指令: 参数错误,请传入字符串数组,例 v-hasPermission="[\'xxx:xxx:xxx\']"')
      }
    }
  })
}

新增指令 ​

在src/directive下新建ts文件,导出 export default (app: App<Element>): void => 函数,函数中接收app 参数,使用 app.directive() 指定指令

import {type App} from 'vue';

export default (app: App<Element>): void => {
    app.directive('name', {
      	// 元素加载时 el 获取到元素,binding获取到参数
        mounted(el, binding) {
        },
      	// 元素销毁时
        unmounted(el) {
        },
    });
};