最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue權(quán)限指令控制權(quán)限詳解

 更新時(shí)間:2022年09月26日 09:28:48   作者:聶大哥  
因?yàn)轫?xiàng)目中需要根據(jù)后端返回的權(quán)限進(jìn)行功能的顯示隱藏,所以就加了個(gè)權(quán)限指令。不用寫if else進(jìn)行判斷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

在日常的開發(fā)過程中,我們除了使用Vue已有的指令之外,還需自定義指令,需要對(duì)DOM節(jié)點(diǎn)進(jìn)一步操作。

在后臺(tái)系統(tǒng)中,最常用的就是權(quán)限指令。

權(quán)限控制的原理就是在系統(tǒng)當(dāng)前界面初始化時(shí),判斷某些DOM節(jié)點(diǎn)有沒有權(quán)限,沒有則移除此DOM。

在Vue中使用指令權(quán)限時(shí),通常有兩種控制節(jié)點(diǎn)的方法。第一個(gè)是對(duì)普通節(jié)點(diǎn)的指令控制(普通節(jié)點(diǎn)即是指 html 中的標(biāo)簽節(jié)點(diǎn)。),第二個(gè)則是對(duì)elementUI組件的控制。

為什么分兩種呢?是因?yàn)樵趯?shí)際開發(fā)過程中,我發(fā)現(xiàn)自定義指令有時(shí)候無法移除element中的組件,例如:在使用el-tab時(shí),下面包含了多個(gè)tab頁,當(dāng)某個(gè)tab頁無權(quán)限訪問時(shí) 想要對(duì)其進(jìn)行移除,這時(shí)候自定義的指令只能移除此tab頁內(nèi)的內(nèi)容,并不能夠?qū)⒋藅ab頁一起移除。所以這時(shí)候會(huì)使用v-if進(jìn)行控制。

第一種-自定義權(quán)限指令

我的寫法是新建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('需要以數(shù)組的形式傳角色')
	}
}
export default {
	inserted(el, binding) {
		checkPermission(el, binding)
	},
	update(el, binding) {
		checkPermission(el, binding)
	}
}

在這里面需要解釋的是權(quán)限列表的獲取,我的權(quán)限列表是存儲(chǔ)在store的permission中,所以在進(jìn)入的時(shí)候直接獲取permission。

最重要的一步,需要將index.js引入到main.js中去執(zhí)行。

main.js

import './permission' // 此引入需要在創(chuàng)建Vue實(shí)例之前引用

用法:

<el-button v-permission="['add']">權(quán)限按鈕</el-button>

第二種:v-if自定義控制

如果使用第一種方式的話,其是移除當(dāng)前DOM下的子節(jié)點(diǎn),是沒辦法移除當(dāng)前節(jié)點(diǎn)的。所以這時(shí)候就需要通過自定義的v-if來控制。

思路:v-if中執(zhí)行一個(gè)函數(shù),函數(shù)傳入一個(gè)權(quán)限值。在函數(shù)中判斷權(quán)限值是否屬于權(quán)限菜單內(nèi),返回布爾類型值。

這時(shí)我們想到,如果要定義一個(gè)函數(shù)在任何組件中都可以使用,那么要么是工具類函數(shù),要么是mixins。如果是封裝工具類函數(shù),則沒辦法直接在模板中使用,而是需要在methods中使用,所以我們直接選擇mixins,混入方法。

我們創(chuàng)建控制節(jié)點(diǎn)的文件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>

最后說明

為什么控制節(jié)點(diǎn)權(quán)限要分兩種情況?同樣都是移除節(jié)點(diǎn),為什么還要用v-if?

如果你仔細(xì)觀察代碼,在第一種方式中,我們移除的是 child,是將當(dāng)前節(jié)點(diǎn)的子元素進(jìn)行移除,此時(shí)當(dāng)前節(jié)點(diǎn)依然存在。所以就出現(xiàn)了所分的兩種情況。

那有沒有辦法用自定義的指令就可以完成移除呢?那當(dāng)然是有的,在第一種方式中,只需要將removeChild改為remove即可。即將移除子元素改為移除當(dāng)前節(jié)點(diǎn)本身。

到此這篇關(guān)于Vue權(quán)限指令控制權(quán)限詳解的文章就介紹到這了,更多相關(guān)Vue權(quán)限指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3中使用ref和emit來減少props的使用示例詳解

    vue3中使用ref和emit來減少props的使用示例詳解

    現(xiàn)在在開發(fā)vue3項(xiàng)目的過程中,我們開發(fā)小組漸漸的減少props的使用,轉(zhuǎn)而用ref 和 emit 來代替,這篇文章主要介紹了vue3中使用ref和emit來減少props的使用,需要的朋友可以參考下
    2022-06-06
  • vue 實(shí)現(xiàn)websocket發(fā)送消息并實(shí)時(shí)接收消息

    vue 實(shí)現(xiàn)websocket發(fā)送消息并實(shí)時(shí)接收消息

    這篇文章主要介紹了vue 實(shí)現(xiàn)websocket發(fā)送消息并實(shí)時(shí)接收消息,項(xiàng)目結(jié)合vue腳手架和websocket來搭建,本文給大家分享實(shí)例代碼,需要的朋友可以參考下
    2019-12-12
  • 淺談將three項(xiàng)目遷移至vue項(xiàng)目遇到的問題

    淺談將three項(xiàng)目遷移至vue項(xiàng)目遇到的問題

    本文主要介紹了將three項(xiàng)目遷移至vue項(xiàng)目遇到的問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 在vue-cli中組件通信的方法

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

    本篇文章主要介紹了在vue-cli中組件通信的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Vue使用v-viewer插件實(shí)現(xiàn)圖片預(yù)覽和縮放和旋轉(zhuǎn)等功能(推薦)

    Vue使用v-viewer插件實(shí)現(xiàn)圖片預(yù)覽和縮放和旋轉(zhuǎn)等功能(推薦)

    v-viewer是一個(gè)基于viewerjs封裝的vue圖片預(yù)覽組件,有預(yù)覽縮放拉伸旋轉(zhuǎn)切換拖拽等功能,支持配置化,這篇文章主要介紹了Vue使用v-viewer插件實(shí)現(xiàn)圖片預(yù)覽和縮放和旋轉(zhuǎn)等功能,需要的朋友可以參考下
    2023-02-02
  • Vue使用Pinia輕松實(shí)現(xiàn)狀態(tài)管理

    Vue使用Pinia輕松實(shí)現(xiàn)狀態(tài)管理

    pinia,一個(gè)基于Vue3的狀態(tài)管理庫,它可以幫助開發(fā)人員管理Vue應(yīng)用程序的狀態(tài),本文主要為大家介紹了Pinia的用法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • Vue動(dòng)態(tài)組件與異步組件實(shí)例詳解

    Vue動(dòng)態(tài)組件與異步組件實(shí)例詳解

    這篇文章主要介紹了Vue動(dòng)態(tài)組件與異步組件,結(jié)合實(shí)例形式分析了動(dòng)態(tài)組件與異步組件相關(guān)概念、功能及使用技巧,需要的朋友可以參考下
    2019-02-02
  • vue如何實(shí)現(xiàn)動(dòng)態(tài)改變地址欄的參數(shù)值

    vue如何實(shí)現(xiàn)動(dòng)態(tài)改變地址欄的參數(shù)值

    這篇文章主要介紹了vue如何實(shí)現(xiàn)動(dòng)態(tài)改變地址欄的參數(shù)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 關(guān)于vue.js彈窗組件的知識(shí)點(diǎn)總結(jié)

    關(guān)于vue.js彈窗組件的知識(shí)點(diǎn)總結(jié)

    最近在開發(fā)過程對(duì)對(duì)于組件化的開發(fā)有一些感想,于是開始記錄下這些。彈窗組件一直是 web 開發(fā)中必備的,使用頻率相當(dāng)高,最常見的莫過于 alert,confirm和prompt這些,不同的組件庫對(duì)于彈窗的處理也是不一樣的,下面來一起看看吧。
    2016-09-09
  • vue使用keep-alive保持滾動(dòng)條位置的實(shí)現(xiàn)方法

    vue使用keep-alive保持滾動(dòng)條位置的實(shí)現(xiàn)方法

    這篇文章主要介紹了vue使用keep-alive保持滾動(dòng)條位置的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

稷山县| 武邑县| 章丘市| 聂拉木县| 万山特区| 江阴市| 萨迦县| 开化县| 筠连县| 延川县| 上栗县| 双桥区| 灯塔市| 芜湖县| 克山县| 松原市| 梅州市| 平利县| 澄江县| 定西市| 探索| 永济市| 云梦县| 新津县| 揭阳市| 来宾市| 定陶县| 密山市| 镇原县| 玛纳斯县| 共和县| 当雄县| 衡阳市| 开化县| 富蕴县| 文昌市| 龙口市| 宝坻区| 邹平县| 康乐县| 固阳县|