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指令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Vue3中创建和使用全局组件的实现方式

    在Vue3中创建和使用全局组件的实现方式

    在前端开发中,Vue.js 是一个广泛使用的框架,因其灵活性和强大的功能,得到许多开发者的喜爱,Vue 3 的发布为这一框架带来了很多新的特性和改进,在本文中,我们将详细讨论如何在 Vue 3 中创建和使用全局组件,并通过示例代码展示具体实现方式,需要的朋友可以参考下
    2024-07-07
  • 深入理解Vue的数据响应式

    深入理解Vue的数据响应式

    Vue.js的核心包括一套“响应式系统”。“响应式”,是指当数据改变后,Vue会通知到使用该数据的代码。例如,视图渲染中使用了数据,数据改变后,视图也会自动更新。
    2021-05-05
  • 7个适用于Vue 3的高颜值UI组件库

    7个适用于Vue 3的高颜值UI组件库

    这篇文章主要给大家分享介绍了7个适用于Vue 3的高颜值UI组件库,合理利用,又或者学习借鉴都是不错的选择,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 解决Vue数据更新了但页面没有更新的问题

    解决Vue数据更新了但页面没有更新的问题

    在vue项目中,有些我们会遇到修改完数据,但是视图却没有更新的情况,具体的场景不一样,解决问题的方法也不一样,在网上看了很多文章,在此总结汇总一下,需要的朋友可以参考下
    2023-08-08
  • 解决vue-router中的query动态传参问题

    解决vue-router中的query动态传参问题

    下面小编就为大家分享一篇解决vue-router中的query动态传参问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue使用百度地图报错BMap is not defined问题及解决

    vue使用百度地图报错BMap is not defined问题及解决

    这篇文章主要介绍了vue使用百度地图报错BMap is not defined问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue.js实现三级菜单效果

    vue.js实现三级菜单效果

    这篇文章主要为大家详细介绍了vue.js实现三级菜单效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • vue iview多张图片大图预览、缩放翻转

    vue iview多张图片大图预览、缩放翻转

    这篇文章主要为大家详细介绍了vue iview多张图片大图预览、缩放翻转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • vue项目两种方式实现竖向表格的思路分析

    vue项目两种方式实现竖向表格的思路分析

    这篇文章主要介绍了vue项目两种方式实现竖向表格的思路分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • vue3 emit is not a function问题及解决

    vue3 emit is not a function问题及解决

    这篇文章主要介绍了vue3 emit is not a function问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09

最新评论