Skip to content

指令

介绍模板项目中现有指令(directives)内容。

v-permission

通过 v-permission 指令的方式控制用户权限。

使用方式

vue
<el-button v-permission="[FM_FILE.FC_CAD_PREVIEW.DEL]">删除</el-button>
或者
<el-button v-permission="FM_FILE.FC_CAD_PREVIEW.DEL">删除</el-button>

源码见src/directives/permission/index

ts
/**
 * @description: 控制用户操作权限
 */
import { Directive } from 'vue';
import { useUserStore } from '@/store/user';
import { intersection } from '@/utils/index';
import { isPlainArray } from '@/utils/validate';

export const permission: Directive = {
  mounted(el: any, binding: any) {
    const userStore = useUserStore();
    const authKeys: string[] = userStore.authKeys;

    const { value } = binding; // 指令接收到的值
    if (value && typeof value === 'string') {
      const hasPermission = authKeys.includes(value);
      if (!hasPermission) {
        el.remove();
      }
    } else if (value && isPlainArray(value)) { // 指令是数组
      const hasPermission = intersection(authKeys, value).length > 0;
      if (!hasPermission) {
        el.remove();
      }
    } else {
      throw new Error("need roles! Like v-permission='[FM_FILE.FC_CAD_PREVIEW.R]' or v-permission='FM_FILE.FC_CAD_PREVIEW.R'");
    }
  },
};

v-blur

通过 v-blur 指令解决 elementPlus 的 button 按钮点击之后不会复原问题。

使用方式

vue
<el-button 
  v-blur 
  v-permission="[FM_FILE.FC_CAD_PREVIEW.DEL]">
  删除
</el-button>
或者

源码见src/directives/blur/index

ts
/**
 * @description: 解决 elementPlus 的 button 按钮点击之后不会复原问题
 */
import { Directive, type DirectiveBinding, type VNode } from 'vue';

const elBlur = (el: HTMLElement) => () => el?.blur();
export const blur: Directive = {
  created(el: HTMLElement, binding: DirectiveBinding, vnode: VNode) {
    if (vnode?.type === 'button') {
      el.addEventListener('click', elBlur(el));
    }
  },
  unmounted(el: HTMLElement) {
    el.removeEventListener('click', elBlur(el));
  },
};

内容由donymh提供,如有疑问,请微信联系lmingh6