Vue3如何自定义v-permission权限指令

 更新时间:2024年12月13日 11:34:00   作者:头发秃头小宝贝  
这篇文章主要为大家详细介绍了Vue3如何编写一个 v-permission 指令来根据用户权限动态控制元素的渲染,感兴趣的小伙伴可以参考一下

在 Vue3 + TypeScript 项目中,可以通过自定义指令来控制元素的显示与隐藏,实现权限管理功能。本文将详细介绍如何编写一个 v-permission 指令来根据用户权限动态控制元素的渲染。

功能概述

v-permission 是一个自定义指令,作用如下:

  • 传入一个权限数组,例如 ['OrderList']
  • 从 Vuex 中获取用户拥有的权限列表。
  • 如果用户没有指定权限,则从 DOM 中移除对应元素。
  • 支持动态更新,通过 updated 钩子重新检查权限。

实现步骤

1. 新建 directives/permission.ts

在项目的 directives 目录下新建 permission.ts,内容如下:

import { App, DirectiveBinding } from 'vue';
import store from '@/store';

// 判断是否有权限
const hasPermission = (value: Array<string>, el: Element) => {
  // 检查是否配置了权限参数
  if (!Array.isArray(value) || value.length === 0) {
    throw new Error(`v-permission 需要配置权限,例如 v-permission="['xxx']"`);
  }

  // 获取用户权限
  const ruleNames: Array<string> = store.getters['menu/getRuleNames'] || [];
  if (!Array.isArray(ruleNames)) {
    console.warn('权限数据 "menu/getRuleNames" 格式不正确,请检查 store 配置。');
    return;
  }

  // 判断是否有权限
  const hasAuth = value.some((val) => ruleNames.includes(val));
  if (!hasAuth && el.parentNode) {
    el.parentNode.removeChild(el); // 移除元素
  }
  return hasAuth;
};

export default {
  install(app: App) {
    app.directive('permission', {
      mounted(el: Element, binding: DirectiveBinding) {
        hasPermission(binding.value, el);
      },
      updated(el: Element, binding: DirectiveBinding) {
        hasPermission(binding.value, el);
      },
    });
  },
};

功能说明

  • mounted 钩子:元素挂载时检查权限,如果没有权限,移除元素。
  • updated 钩子:元素或绑定值更新时重新检查权限。
  • 错误提示:当传入的值不正确时,抛出错误或给出警告。
  • store.getters['menu/getRuleNames'] :假设从 Vuex 中获取用户权限列表,返回一个字符串数组。

2. 在 main.ts 中引入指令

main.ts 文件中注册该指令:

import { createApp } from 'vue';
import App from './App.vue';
import store from '@/store';
import permission from '@/directives/permission';

const app = createApp(App);
app.use(store);
app.use(permission); // 注册自定义指令
app.mount('#app');

3. 使用 v-permission 指令

在模板中使用 v-permission 指令,传入权限数组:

<template>
  <div>
    <!-- 用户拥有 'OrderList'权限时显示 -->
    <button v-permission="['OrderList']">有权限的按钮</button>

    <!-- 仅管理员权限时显示 -->
    <div v-permission="['admin']">仅管理员可见内容</div>
  </div>
</template>

4.权限数据说明

假设 store.getters['menu/getRuleNames'] 返回如下权限数组:

['OrderList', 'admin', 'user:read']

  • 如果传入 ['admin'],当前用户拥有该权限,则元素显示。
  • 如果传入 ['user:write'],当前用户没有该权限,则元素被移除

完整流程回顾

  • 定义 permission 指令:判断权限并移除无权限的元素。
  • 注册指令:在 main.ts 中注册全局指令。
  • 使用指令:在模板中使用 v-permission,传入所需权限数组。
  • 支持动态更新:元素更新时会重新检查权限。

注意事项

  • store.getters 配置:确保权限数据正确配置在 Vuex 中,并返回一个数组格式。
  • 传参校验v-permission 绑定的值必须是数组,否则会抛出错误。
  • 动态权限变化:如果权限列表动态更新,需要确保页面重新渲染或触发指令的 updated 钩子。

总结

通过 v-permission 自定义指令,可以在 Vue3 项目中轻松实现权限控制,移除无权限的元素,提升用户体验和项目安全性。根据实际需求,还可以进一步扩展此指令,例如实现隐藏元素而非移除元素、支持多种权限逻辑等。

到此这篇关于Vue3如何自定义v-permission权限指令的文章就介绍到这了,更多相关Vue3 v-permission指令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue中v-model如何绑定多循环表达式实战案例

    vue中v-model如何绑定多循环表达式实战案例

    v-model绑定的变量无论是对象还是数组都是绑定的value值,下面这篇文章主要给大家介绍了关于vue中v-model如何绑定多循环表达式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • vue中使用typescript配置步骤

    vue中使用typescript配置步骤

    本文主要介绍了vue中使用typescript配置,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Vue项目引用百度地图并实现搜索定位等功能(案例分析)

    Vue项目引用百度地图并实现搜索定位等功能(案例分析)

    这篇文章主要介绍了Vue项目引用百度地图并实现搜索定位等功能(案例分析),本篇文章为案例分析,技术点较多,所以篇幅较长,认真阅览的你一定会学到很多知识,需要的朋友可以参考下
    2022-09-09
  • Vue3+TS实现数字滚动效果CountTo组件

    Vue3+TS实现数字滚动效果CountTo组件

    最近开发有个需求需要酷炫的文字滚动效果,发现vue2版本的CountTo组件不适用与Vue3,没有轮子咋办,那咱造一个呗,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-11-11
  • vue使用element-ui的el-image的问题分析

    vue使用element-ui的el-image的问题分析

    这篇文章主要介绍了vue使用element-ui的el-image的问题分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Element-ui tree组件自定义节点使用方法代码详解

    Element-ui tree组件自定义节点使用方法代码详解

    本文通过实例代码给大家介绍了Element-ui tree组件自定义节点使用方法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • vue项目中form data形式传参方式

    vue项目中form data形式传参方式

    这篇文章主要介绍了vue项目中form data形式传参方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Vue3造轮子之打包构建配置二级目录方式

    Vue3造轮子之打包构建配置二级目录方式

    这篇文章主要介绍了Vue3造轮子之打包构建配置二级目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Vue配合Vant使用时area省市区选择器的使用方式

    Vue配合Vant使用时area省市区选择器的使用方式

    这篇文章主要介绍了Vue配合Vant使用时area省市区选择器的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue页面跳转过渡动画与防止抖动方式

    vue页面跳转过渡动画与防止抖动方式

    这篇文章主要介绍了vue页面跳转过渡动画与防止抖动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03

最新评论