vue 按钮权限

2023-11-13

项目中按钮的操作权限我们可以直接使用 v-if 判断就行,但是每个页面都要写一堆判断不太雅观。
所以,可以写一个全局函数或者自定义指令 ,两种方式优雅的实现。

一、全局函数

一般在登陆接口中后台就把权限列表信息提供了,可以把他存到缓存或者vuex里。

vuex中设置权限数据,具体代码如下

import Vue from 'vue'
import Vuex from 'vuex'
import app from './modules/app'
import tagsView from './modules/tagsView'
import { constantRoutes } from '../router/index'

Vue.use(Vuex)

const store = new Vuex.Store({
	state: {
		//设置属性,用于保存后台接口返回的权限数据
		permission: [],
	},
	mutations: {
		SET_PERMISSION(state, permission) { //permission 为传入的权限标识集合
			// 传入的权限集合 赋值给状态中的 permission
			sessionStorage.setItem('permission', JSON.stringify(permission));
		},
	},
	actions: { // 官方不推荐直接修改mutation, 可使用actions来提交 mutation
		SET_PERMISSION(context, permission) {
			// 提交到 mutation 中的 SET_PERMISSION 函数
			// context.commit("SET_PERMISSION", permission);
			sessionStorage.setItem('permission', JSON.stringify(permission));
		},
	}
})

export default store

在登录的页面,获取用户权限信息的时候就可以触发SET_PERMISSION这个方法

//res.data.data.menuPermission就是相应的权限数据
this.$store.dispatch(
	"SET_PERMISSION",
	res.data.data.menuPermission
);

在 utils 文件夹创建一个 permission.js 文件

import store from '../store/index.js'
/**
 * 判断是否有权限。根据传入的权限标识,查看是否存在于用户的权限标识集合内。
 */
export function hasPermission (perms) {
  let hasPermission = false;
  let permission = store.state.user.role.rights
  for (let item of permission) {
    if (item === perms) {
      hasPermission = true;
      break;
    }
  }
  return hasPermission;
}

在需要用到的组件引用

<template>
  <el-button :disabled="!hasPerms('edit')">编辑</el-button>
</template>

<script>
  // 禁用标识
  // :disabled="!hasPerms(perms)"
import { hasPermission } from '@utils/Permission/index.js'
export default {
  data() {
    return {
    }
  },
  methods: {
      hasPerms(perms) {
      // 根据权限标识和外部指示状态进行权限判断
      return hasPermission(perms) // !this.disabled
    }
  }
}
</script>

二、自定义指令

创建 premission.js 文件

import Vue from 'vue'
import store from '../store/index.js'
//自定义指令,用来控制按钮权限
Vue.directive('permission', {
  inserted (el, binding) {
    // 当前按钮传递的值( v-permission="'add'" 中的值)
    const currentTag = binding.value.action
    const effect = binding.value.effect
    // 获取到存放在 store 中的权限数据
    const currentRight = store.state.user.role.rights
    // 判断是否存在对应的按钮权限
    let item = currentRight.filter((item) => {
      return item === currentTag
    })
    //不具备权限则删除(隐藏)或者禁用该按钮 (el.parentNode 获取当前节点的父节点),根据在芫荽绑定的值去决定
    if (item.length === 0) {
      if (effect === 'disabled') {
        el.disabled = true
        el.classList.add('is-disabled')
      } else {
        el.parentNode.removeChild(el)
      }
    }
  }
})

在页面中使用按钮时, 用上自定义的 v-premission 指令

<el-button v-permission="{action:'edit',effect:'disabled'}">编辑</el-button>

注意:在vue3中,使用方式有所不同
permission.js文件

import App from './App.vue'
import store from '../store/index.js'
const app = createApp(App);

app.directive('permission', {
   mounted(el, binding) {
      // 当前按钮传递的值( v-permission="'add'" 中的值)
	    const currentTag = binding.value.action
	    const effect = binding.value.effect
	    // 获取到存放在 store 中的权限数据
	    const currentRight = store.state.user.role.rights
       // 判断是否存在对应的按钮权限
	    let item = currentRight.filter((item) => {
	      return item === currentTag
	    })
	    //不具备权限则删除(隐藏)或者禁用该按钮 (el.parentNode 获取当前节点的父节点),根据在芫荽绑定的值去决定
	    if (item.length === 0) {
	      if (effect === 'disabled') {
	        el.disabled = true
	        el.classList.add('is-disabled')
	      } else {
	        el.parentNode.removeChild(el)
	      }
    	}
   }
})

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue 按钮权限 的相关文章

  • 如何在Vuejs中动态管理页面标题?

    我构建一个应用程序 我有一个带有页面标题的标题 目前 我使用视图路由器来定义我的标题 path events name events component Events meta title Liste des v nements 在我的刀片
  • 如何以编程方式添加 Vue 3 组件?

    Vue 3 没有 Vue extend 方法 因此这里的示例不起作用 https css tricks com creating vue js component instances programmatically https css t
  • VueJS - 验证表单文件上传中的文件大小要求

    我正在使用 Bootstrap Vue 表单制作一个简单的表单 用户可以在其中上传文件 有没有办法验证使用 Vue 表单选择的文件的大小 我想阻止用户上传此类文件 我见过this https stackoverflow com questi
  • Vue 3 控制台中的 Proxy 是什么意思?

    我正在对数组进行洗牌 并在控制台中收到一条奇怪的消息 我的 JSON 文件如下所示 id 1 name Sushi image https images pexels com photos 1640777 pexels photo 1640
  • Laravel Echo 不监听推送事件

    尝试使用 laravel 和 vuejs 创建一种聊天应用程序 发送消息后 我会从 laravel 触发事件 该事件会使用正确的事件类反映在推送器调试控制台上 但根本不会调用来自 vuejs 的监听回调 created window Ech
  • 在 ES6 中使用 import 和 require 的正确方法是什么?

    关于 import 和 require 及其差异有多个问题 像这些 JavaScript 中的 import 和 require 有什么区别 https stackoverflow com questions 51373933 what i
  • Vue.js 更改 {{ }} 标签

    我想改变 something by 在 Vue js 中 我怎样才能实现这一点 这可能吗 我在 AngularJS 中寻找的等效项 var app angular module app function interpolateProvide
  • 如何同时模拟Pinia和vue-i18n?

    我正在使用 Vue 3 的 Composition API 如下所示 store ts import ref Ref from vue import defineStore from pinia export const useStore
  • 多维数组、Vuex 和变异

    我正在尝试添加和删除存储在 Vuex 中的多维数组中的项目 数组是一组类别 每个类别又有一个子类别 无穷大 不是简单的二维数组 示例数据集是这样的 id 123 name technology parent id null children
  • npm run dev 和 npm run production 之间的区别

    我对 Laravel 和 vue js 很陌生 请让我知道它们之间有什么区别npm run dev and npm run production 这和环境有关系吗 npm run dev创建源映射并且不会缩小 js css 这使得调试和查找
  • 无法使用Vue获取灵活元素的CSS属性值

    我正在尝试获取 CSSwidth灵活元素的属性 但由于某种原因它不起作用 代码笔 https codepen io anon pen pLEwdp editors 1010 https codepen io anon pen pLEwdp
  • 未向导出的模块提供此上下文

    我对问题的提出感到不满意 受到鼓励提出改进建议 另外 请记住 由于无知 无知导致烦恼 我对问题的诊断可能有缺陷 对于那个很抱歉 In 这个答案 https stackoverflow com a 40893583 1525840建议使用th
  • 在新窗口中打开 VueJS 组件

    我有一个只有一页的基本 VueJS 应用程序 它不是 SPA 而且我不使用 vue router 我想实现一个按钮 单击该按钮时会使用我的 Vue 组件之一的内容执行 window open 函数 查看来自的文档window open ht
  • Vue 3 Composition API 提供/注入在单文件组件中不起作用

    我正在使用 Composition API 在 VueJS 3 中创建一个库 我实现了提供 注入 如中所述docs https v3 vuejs org guide composition api provide inject html i
  • 在渲染组件之前从 api 获取数据

    我在渲染页面之前发送 2 个 api 请求 const Profile template profile attributes null photos data function return attributes Profile attr
  • 如何处理 Nuxt 中导致页面渲染崩溃的 apollo 客户端错误?

    我目前正在维护一个生产 Nuxt js Vue 应用程序 该应用程序集成了 GraphQL Apollo 客户端 该客户端遇到页面渲染错误 为了增加获得回复的机会 我构建了一个简单的代码示例 仅展示我们遇到的问题 谢谢大家 源代码 Clie
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 将 CKEditor 5 与 nuxtjs 结合使用

    我正在尝试在我的 Nuxtjs 项目中导入 CKEditor 5 的自定义版本 并且我已经尝试了所有可能的方法来正确导入它 但没有一个对我有用 这是其中之一 let ClassicEditor let CKEditor if process
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev
  • (thread_id_key != 0x7777),函数 find_thread_id_key,文件 ../src/coroutine.cc,第 134 行

    我正在开发一个vue程序 我尝试过npm run serve 然后我得到了这个 66 building 670 715 modules 45 active Users bytedance go src code byted org ad o

随机推荐

  • 闲鱼x-sign, x-mini-wua算法签名接口调用

    远程调用x sign x mini wua算法接口链接 xxxxx 5000 xianyu sign mim wua itemId 649780866851 x sign 结算结果需要传入的参数值 deviceId utdid appKey
  • 逗号运算符

    逗号运算符是指在C语言中 多个表达式可以用逗号分开 其中用逗号分开的表达式的值分别结算 但整个表达式的值是最后一个表达式的值 在前端的一些笔试中也可以看到逗号运算符的存在 作为C语言中的运算级别最低的一员 逗号运算符 结合的方向是 从左往右
  • dat文件

    DAT 数字录音带 是一种用于磁带数字录音的专业品质级别的标准媒体和技术 DAT设备就是一个数字磁带录音器 具有与录像机相似的旋转型磁头 大多数的DAT设备都能以44 1千赫 CD音频标准 以及48千赫的采样率来录音 DAT已经成为掌握录音
  • 在Java中如何判断字符串的编码格式

    最近 我一直试图寻找一种判断Java程序中字符串编码格式的方法 同时 也查找了很多资料 设计了一个的程序 美中不足的是该方法对仅含有数字和英文字母的字符串无效 原理 ASCII GBK UTF 8对数字和英文字母的编码相同 对其它字符编码不
  • GD32F105的CAN通讯,可以发送数据,但接收不到数据

    项目简介 使用的芯片型号GD32F105VC 芯片资源CAN1 波特率500k 调试过程中发现发送数据正常 但是接收不到数据 总结几点注意事项如下 1 需要设置滤波器 若未设置滤波器 则接收不到数据 傻傻的认为滤波器配置问题 以为注释掉滤波
  • vue-vuetify-admin案例讲解

    vue vuetify admin案例讲解 1 Introduction 1 1 directory structure 1 2 vue cli 1 3 vuex 1 3 1 在store目录创建index js 1 3 2 在main j
  • 队列(一种遵循先进先出原则的数据结构)

    目录 1 队列 Queue 2 队列的抽象数据类型 队列ADT 3 队列接口 4 利用数组实现队列 4 1 队列的实现 4 2 利用数组实现队列的优势与缺点 5 利用单链表实现队列 5 1 队列的实现 5 2 利用单链表实现队列的优势与缺点
  • js对象的继承

    学无止境 望君把握时间 首先我们需要定义一个类 定义一个动物类 function Animal name 属性 this name name Animal 实例方法 this sleep function console log this
  • js增加class或者删除class

    1 比较传统的方法 var classVal document getElementById id getAttribute class 删除的话 classVal classVal replace someClassName docume
  • GAMES101: 现代计算机图形学入门(2)几何、光线追踪

    GAMES101 现代计算机图形学入门 链接 GAMES101 1 几何 1 1 几何的表示 隐式几何 通过一个函数表达式来表示的几何体 即 f x y z 0 优点 很容易判断一个点在不在几何体上 缺点 很难通过表达式看出几何体的形状 显
  • 菜鸟求职记6

    来到古城已经整整38天了 本想快快的找到工作然后做自己这三年来都没有做的事情 旅游 看电视 打篮球 打乒乓球 可是 事实却并非如此 这一个多月的苦衷可以说是一言难尽呀 到了此时此刻 恐怕每一个人都已经累得奄奄一息了 每个人曾经的自信都被现实
  • StrongSORT:Make DeepSORT Great Again

    1北京邮电大学2中国网络系统与网络文化北京市重点实验室 摘要 现有的多目标跟踪 Multi Object Tracking MOT 方法大致可以分为基于检测的跟踪和联合检测关联两种范式 虽然后者引起了更多的关注 并显示出与前者相当的性能 但
  • 在Android studio中Intent的几种基本使用方法

    在Android开发中 Intent是最基本也是最常用的操作 在Activity Service BroadcastReceiver这些核心组件中也需要Intent进行操作 下面我们具体介绍Intent在开发中的一些基本用法 假定目前有Fi
  • 第三方支付 -----支付宝支付流程

    大家都知道 第三方支付 已经普遍都在使用 所以我今天就说一下支付宝的支付流程 首先进入支付宝平台 点击开发中心 研发服务 获得沙盒的appid以及商户公钥和支付宝公钥 然后利用秘钥生成软件生成私钥和公钥 建立keys文件夹 将私钥和公钥文件
  • 将日期字符串转成LocalDateTime

    如果直接用LocalDateTime parse将日期字符串 yyyy MM dd 转成LocalDateTime会导致报错 所以我这里提供了将日期字符串转成LocalDateTime的方法 仅供参考 如有更好方式 欢迎大家分享 impor
  • WSL2报错:nvidia-smi Command ‘nvidia-smi‘ not found, but can be installed with:

    这里写自定义目录标题 找了很多方法 解决 分割线 WSL2部署 找了很多方法 在社区找了很多方法 结果在b站评论区找到了一个方法给解决了 原本一开始有人说是驱动版本问题 我nvcc V是ok的 但是nvidia smi一直报错 Comman
  • LaTeX排版(一):字体、页眉页脚、页边距、行距的设置

    目录 字体设置 布局设置 页眉页脚设置 行距的设置 其他 字体设置 字体设置需要用到宏包fontspec 需要在导言区添加如下指令 usepackage fontspec 中英文字体都可以分为如下3种 正文字体族 无衬线字体族 打字机字体族
  • 十进制转十六进制 C++

    目录 题目描述 思路分析 AC代码 题目描述 编写一个函数 传入一个十进制的正整数 将十进制整数转换为十六进制的字符串并返回 十六进制字符串中的字母全部大写 输入描述 键盘输入一个十进制的正整数 输出描述 输出该十进制整数转换后的十六进制字
  • 硬盘柱面损坏怎么办_最靠谱的机械硬盘坏道修复工具一:DiskGenius

    DiskGenius是一款硬盘分区 数据修复软件 DiskGenius的功能非常丰富 然而很多时候 我们都只是用DiskGenius来分区硬盘 对硬盘进行一些常规性能的操作 常常忽略了DiskGenius最重要的一个功能 那就是机械硬盘的坏
  • vue 按钮权限

    项目中按钮的操作权限我们可以直接使用 v if 判断就行 但是每个页面都要写一堆判断不太雅观 所以 可以写一个全局函数或者自定义指令 两种方式优雅的实现 一 全局函数 一般在登陆接口中后台就把权限列表信息提供了 可以把他存到缓存或者vuex