Vue权限指令控制权限详解

 更新时间:2022年09月26日 09:28:48   作者:聂大哥  
因为项目中需要根据后端返回的权限进行功能的显示隐藏,所以就加了个权限指令。不用写if else进行判断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

在日常的开发过程中,我们除了使用Vue已有的指令之外,还需自定义指令,需要对DOM节点进一步操作。

在后台系统中,最常用的就是权限指令。

权限控制的原理就是在系统当前界面初始化时,判断某些DOM节点有没有权限,没有则移除此DOM。

在Vue中使用指令权限时,通常有两种控制节点的方法。第一个是对普通节点的指令控制(普通节点即是指 html 中的标签节点。),第二个则是对elementUI组件的控制。

为什么分两种呢?是因为在实际开发过程中,我发现自定义指令有时候无法移除element中的组件,例如:在使用el-tab时,下面包含了多个tab页,当某个tab页无权限访问时 想要对其进行移除,这时候自定义的指令只能移除此tab页内的内容,并不能够将此tab页一起移除。所以这时候会使用v-if进行控制。

第一种-自定义权限指令

我的写法是新建permission文件夹,此文件夹下面包含index.js、permission.js,接下来直接上代码:

index.js

import permission from './permission'
import Vue from 'vue'
Vue.directive('permission', permission)

permission.js

import store from '@/store'
async function checkPermission(el, binding) {
	const { value } = binding
	const roles = await store.getters && store.getters.permission
	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 {
	inserted(el, binding) {
		checkPermission(el, binding)
	},
	update(el, binding) {
		checkPermission(el, binding)
	}
}

在这里面需要解释的是权限列表的获取,我的权限列表是存储在store的permission中,所以在进入的时候直接获取permission。

最重要的一步,需要将index.js引入到main.js中去执行。

main.js

import './permission' // 此引入需要在创建Vue实例之前引用

用法:

<el-button v-permission="['add']">权限按钮</el-button>

第二种:v-if自定义控制

如果使用第一种方式的话,其是移除当前DOM下的子节点,是没办法移除当前节点的。所以这时候就需要通过自定义的v-if来控制。

思路:v-if中执行一个函数,函数传入一个权限值。在函数中判断权限值是否属于权限菜单内,返回布尔类型值。

这时我们想到,如果要定义一个函数在任何组件中都可以使用,那么要么是工具类函数,要么是mixins。如果是封装工具类函数,则没办法直接在模板中使用,而是需要在methods中使用,所以我们直接选择mixins,混入方法。

我们创建控制节点的文件controlNode.js

import store from "@/store"
export default {
	methods: {
		controlNode(node) {
			const permission = store.getters.permission
			let result = permission.includes(node)
			return result
		}
	}
}

用法:

在组件中使用mixins

<template>
<div>
	<el-tabs>
		<el-tab-pane v-if="controlNode('add')"></el-tab-pane>
		<el-tab-pane></el-tab-pane>
	</el-tabs>
</div>
</template>
<script>
import controlNode from "@/permission/controlNode"
export default {
	name: "component",
	mixins: [controlNode]
}
</script>

最后说明

为什么控制节点权限要分两种情况?同样都是移除节点,为什么还要用v-if?

如果你仔细观察代码,在第一种方式中,我们移除的是 child,是将当前节点的子元素进行移除,此时当前节点依然存在。所以就出现了所分的两种情况。

那有没有办法用自定义的指令就可以完成移除呢?那当然是有的,在第一种方式中,只需要将removeChild改为remove即可。即将移除子元素改为移除当前节点本身。

到此这篇关于Vue权限指令控制权限详解的文章就介绍到这了,更多相关Vue权限指令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3中使用ref和emit来减少props的使用示例详解

    vue3中使用ref和emit来减少props的使用示例详解

    现在在开发vue3项目的过程中,我们开发小组渐渐的减少props的使用,转而用ref 和 emit 来代替,这篇文章主要介绍了vue3中使用ref和emit来减少props的使用,需要的朋友可以参考下
    2022-06-06
  • vue 实现websocket发送消息并实时接收消息

    vue 实现websocket发送消息并实时接收消息

    这篇文章主要介绍了vue 实现websocket发送消息并实时接收消息,项目结合vue脚手架和websocket来搭建,本文给大家分享实例代码,需要的朋友可以参考下
    2019-12-12
  • 浅谈将three项目迁移至vue项目遇到的问题

    浅谈将three项目迁移至vue项目遇到的问题

    本文主要介绍了将three项目迁移至vue项目遇到的问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 在vue-cli中组件通信的方法

    在vue-cli中组件通信的方法

    本篇文章主要介绍了在vue-cli中组件通信的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Vue使用v-viewer插件实现图片预览和缩放和旋转等功能(推荐)

    Vue使用v-viewer插件实现图片预览和缩放和旋转等功能(推荐)

    v-viewer是一个基于viewerjs封装的vue图片预览组件,有预览缩放拉伸旋转切换拖拽等功能,支持配置化,这篇文章主要介绍了Vue使用v-viewer插件实现图片预览和缩放和旋转等功能,需要的朋友可以参考下
    2023-02-02
  • Vue使用Pinia轻松实现状态管理

    Vue使用Pinia轻松实现状态管理

    pinia,一个基于Vue3的状态管理库,它可以帮助开发人员管理Vue应用程序的状态,本文主要为大家介绍了Pinia的用法,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • Vue动态组件与异步组件实例详解

    Vue动态组件与异步组件实例详解

    这篇文章主要介绍了Vue动态组件与异步组件,结合实例形式分析了动态组件与异步组件相关概念、功能及使用技巧,需要的朋友可以参考下
    2019-02-02
  • vue如何实现动态改变地址栏的参数值

    vue如何实现动态改变地址栏的参数值

    这篇文章主要介绍了vue如何实现动态改变地址栏的参数值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 关于vue.js弹窗组件的知识点总结

    关于vue.js弹窗组件的知识点总结

    最近在开发过程对对于组件化的开发有一些感想,于是开始记录下这些。弹窗组件一直是 web 开发中必备的,使用频率相当高,最常见的莫过于 alert,confirm和prompt这些,不同的组件库对于弹窗的处理也是不一样的,下面来一起看看吧。
    2016-09-09
  • vue使用keep-alive保持滚动条位置的实现方法

    vue使用keep-alive保持滚动条位置的实现方法

    这篇文章主要介绍了vue使用keep-alive保持滚动条位置的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论