Vue權(quán)限指令控制權(quán)限詳解
在日常的開發(fā)過(guò)程中,我們除了使用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)有沒(méi)有權(quán)限,沒(méi)有則移除此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ā)過(guò)程中,我發(fā)現(xiàn)自定義指令有時(shí)候無(wú)法移除element中的組件,例如:在使用el-tab時(shí),下面包含了多個(gè)tab頁(yè),當(dāng)某個(gè)tab頁(yè)無(wú)權(quán)限訪問(wèn)時(shí) 想要對(duì)其進(jìn)行移除,這時(shí)候自定義的指令只能移除此tab頁(yè)內(nèi)的內(nèi)容,并不能夠?qū)⒋藅ab頁(yè)一起移除。所以這時(shí)候會(huì)使用v-if進(jìn)行控制。
第一種-自定義權(quán)限指令
我的寫法是新建permission
文件夾,此文件夾下面包含index.js、permission.js
,接下來(lái)直接上代碼:
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),是沒(méi)辦法移除當(dāng)前節(jié)點(diǎn)的。所以這時(shí)候就需要通過(guò)自定義的v-if來(lái)控制。
思路:v-if中執(zhí)行一個(gè)函數(shù),函數(shù)傳入一個(gè)權(quán)限值。在函數(shù)中判斷權(quán)限值是否屬于權(quán)限菜單內(nèi),返回布爾類型值。
這時(shí)我們想到,如果要定義一個(gè)函數(shù)在任何組件中都可以使用,那么要么是工具類函數(shù),要么是mixins。如果是封裝工具類函數(shù),則沒(méi)辦法直接在模板中使用,而是需要在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>
最后說(shuō)明
為什么控制節(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)了所分的兩種情況。
那有沒(méi)有辦法用自定義的指令就可以完成移除呢?那當(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)文章
vite+vue3項(xiàng)目初始化搭建的實(shí)現(xiàn)步驟
本文主要介紹了vite+vue3項(xiàng)目初始化搭建的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Vue使用antd組件a-form-model實(shí)現(xiàn)數(shù)據(jù)連續(xù)添加功能
這篇文章主要介紹了Vue使用antd組件a-form-model實(shí)現(xiàn)數(shù)據(jù)連續(xù)添加功能,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12vue-cli history模式實(shí)現(xiàn)tomcat部署報(bào)404的解決方式
這篇文章主要介紹了vue-cli history模式實(shí)現(xiàn)tomcat部署報(bào)404的解決方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09vue中v-model指令與.sync修飾符的區(qū)別詳解
本文主要介紹了vue中v-model指令與.sync修飾符的區(qū)別詳解,詳細(xì)的介紹了兩個(gè)的用法和區(qū)別,感興趣的可以了解一下2021-08-08詳解mpvue小程序中怎么引入iconfont字體圖標(biāo)
這篇文章主要介紹了詳解mpvue小程序中怎么引入iconfont字體圖標(biāo),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10element帶輸入建議el-autocomplete的使用
本文主要介紹了element帶輸入建議el-autocomplete的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03深入理解Vue.js3中Reactive的實(shí)現(xiàn)
reactive是Vue 3的Composition API中的一個(gè)函數(shù),它允許你創(chuàng)建一個(gè)響應(yīng)式的數(shù)據(jù)對(duì)象,本文主要介紹了深入理解Vue.js3中Reactive的實(shí)現(xiàn),感興趣的可以了解一下2024-01-01