Appearance
permission 权限控制指令
根据用户权限动态控制元素的可见性、可交互性或是否渲染,支持多种校验策略与处理模式。
安装与引入
按需导入(推荐)
ts
import { VPermission } from '@cuixingjian/cui-utils'1
全局注册
ts
import { createApp } from 'vue'
import { VPermission } from '@cuixingjian/cui-utils'
const app = createApp(App)
app.directive('permission', VPermission)
app.mount('#app')1
2
3
4
5
6
2
3
4
5
6
局部注册
vue
<script setup lang="ts">
import { VPermission as vPermission } from '@cuixingjian/cui-utils'
</script>
<template>
<button v-permission="'admin'">管理员操作</button>
</template>1
2
3
4
5
6
7
2
3
4
5
6
7
效果演示
交互式演示
切换权限查看按钮状态变化。
使用代码
基本用法:
vue
<template>
<button v-permission="'user.create'">新增用户</button>
</template>1
2
3
2
3
多权限(任一满足):
vue
<template>
<button v-permission="{ value: ['user.create', 'admin'], strategy: 'any' }">
新增
</button>
</template>1
2
3
4
5
2
3
4
5
禁用模式:
vue
<template>
<button v-permission="{ value: 'user.delete', mode: 'disable' }">
删除
</button>
</template>1
2
3
4
5
2
3
4
5
自定义校验:
vue
<script setup lang="ts">
function hasPermission(perm: string) {
return userPerms.includes(perm)
}
</script>
<template>
<button v-permission="{ value: 'admin', check: hasPermission }">
管理员操作
</button>
</template>1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
API 说明
指令值类型
| 类型 | 说明 | 示例 |
|---|---|---|
string | 单个权限值 | v-permission="'admin'" |
Array | 多个权限值 | v-permission="['user.create', 'admin']" |
Object | 配置对象 | v-permission="{ value: 'admin', mode: 'hide' }" |
配置选项 (PermissionOptions)
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| value | string | string[] | — | 需要校验的权限值 |
| strategy | 'any' | 'all' | 'not' | 'any' | 校验策略 |
| mode | 'hide' | 'disable' | 'remove' | 'hide' | 处理方式 |
| enabled | boolean | true | 是否启用指令 |
| permissions | string[] | — | 当前用户权限集合 |
| check | (perm: string) => boolean | — | 自定义校验函数 |
| onGranted | (el: Element) => void | — | 校验通过回调 |
| onDenied | (el: Element) => void | — | 校验不通过回调 |
注意事项
校验策略
- any(任一满足):默认策略,权限列表中任一满足即可
- all(全部满足):必须拥有所有权限
- not(全部不满足):用于游客可见内容
处理模式
- hide(隐藏):保留布局空间,元素不可见
- disable(禁用):元素可见但禁用,设置 aria-disabled
- remove(移除):完全从 DOM 移除
权限校验
- 优先使用
check函数 - 其次使用
permissions列表 - 建议统一权限管理入口
无障碍支持
- 禁用模式自动设置
aria-disabled - 移除可聚焦性
- 保持页面可操作性
源码展示
展开查看完整源码
ts
import type { Directive } from 'vue'
import { withInstallDirective } from '../install'
export type PermissionValue = string | string[]
export type PermissionStrategy = 'any' | 'all' | 'not'
export type PermissionMode = 'hide' | 'disable' | 'remove'
export interface PermissionOptions {
value: PermissionValue
strategy?: PermissionStrategy
mode?: PermissionMode
enabled?: boolean
permissions?: string[]
check?: (perm: string) => boolean
onGranted?: (el: Element) => void
onDenied?: (el: Element) => void
}
// 详见 packages/utils/directives/permission.ts
export const VPermission = withInstallDirective(permission, 'permission')1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20