Utils

目标

实现指令 v-permission,用于控制元素的显示与隐藏。

目标

实现指令 v-permission,用于控制元素的显示与隐藏。

步骤

permission.ts

import { DirectiveBinding } from "vue";

function checkPermission(el: HTMLBaseElement, binding: DirectiveBinding) {
  const { value } = binding;
  const roles = ["admin"]; //当前用户的角色

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

      const hasPermission = roles.some((role) => {
        return permissionRoles.includes(role);
      });

      if (!hasPermission) {
        el.parentNode && el.parentNode.removeChild(el);
      }
    }
  } else {
    throw new Error(`暂无权限`);
  }
}

export default {
  mounted(el: HTMLBaseElement, binding: DirectiveBinding) {
    checkPermission(el, binding);
  },
  update(el: HTMLBaseElement, binding: DirectiveBinding) {
    checkPermission(el, binding);
  }
};

main.ts

import { createApp } from "vue";
import App from "./App.vue";

const app = createApp(App);
app.directive("permission", permission);

使用

<template>
  <div>
    <!-- 只允许admin 和 editor -->
    <el-button
      v-permission="['admin','editor']"
      type="primary"
      icon="el-icon-plus"
    >
      新建
    </el-button>
  </div>
</template>