Vue3如何自定義v-permission權(quán)限指令
在 Vue3 + TypeScript 項(xiàng)目中,可以通過自定義指令來(lái)控制元素的顯示與隱藏,實(shí)現(xiàn)權(quán)限管理功能。本文將詳細(xì)介紹如何編寫一個(gè) v-permission
指令來(lái)根據(jù)用戶權(quán)限動(dòng)態(tài)控制元素的渲染。
功能概述
v-permission
是一個(gè)自定義指令,作用如下:
- 傳入一個(gè)權(quán)限數(shù)組,例如
['OrderList']
。 - 從 Vuex 中獲取用戶擁有的權(quán)限列表。
- 如果用戶沒有指定權(quán)限,則從 DOM 中移除對(duì)應(yīng)元素。
- 支持動(dòng)態(tài)更新,通過
updated
鉤子重新檢查權(quán)限。
實(shí)現(xiàn)步驟
1. 新建 directives/permission.ts
在項(xiàng)目的 directives
目錄下新建 permission.ts
,內(nèi)容如下:
import { App, DirectiveBinding } from 'vue'; import store from '@/store'; // 判斷是否有權(quán)限 const hasPermission = (value: Array<string>, el: Element) => { // 檢查是否配置了權(quán)限參數(shù) if (!Array.isArray(value) || value.length === 0) { throw new Error(`v-permission 需要配置權(quán)限,例如 v-permission="['xxx']"`); } // 獲取用戶權(quán)限 const ruleNames: Array<string> = store.getters['menu/getRuleNames'] || []; if (!Array.isArray(ruleNames)) { console.warn('權(quán)限數(shù)據(jù) "menu/getRuleNames" 格式不正確,請(qǐng)檢查 store 配置。'); return; } // 判斷是否有權(quán)限 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
鉤子:元素掛載時(shí)檢查權(quán)限,如果沒有權(quán)限,移除元素。updated
鉤子:元素或綁定值更新時(shí)重新檢查權(quán)限。- 錯(cuò)誤提示:當(dāng)傳入的值不正確時(shí),拋出錯(cuò)誤或給出警告。
store.getters['menu/getRuleNames']
:假設(shè)從 Vuex 中獲取用戶權(quán)限列表,返回一個(gè)字符串?dāng)?shù)組。
2. 在 main.ts 中引入指令
在 main.ts
文件中注冊(cè)該指令:
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); // 注冊(cè)自定義指令 app.mount('#app');
3. 使用 v-permission
指令
在模板中使用 v-permission
指令,傳入權(quán)限數(shù)組:
<template> <div> <!-- 用戶擁有 'OrderList'權(quán)限時(shí)顯示 --> <button v-permission="['OrderList']">有權(quán)限的按鈕</button> <!-- 僅管理員權(quán)限時(shí)顯示 --> <div v-permission="['admin']">僅管理員可見內(nèi)容</div> </div> </template>
4.權(quán)限數(shù)據(jù)說明
假設(shè) store.getters['menu/getRuleNames']
返回如下權(quán)限數(shù)組:
['OrderList', 'admin', 'user:read']
- 如果傳入
['admin']
,當(dāng)前用戶擁有該權(quán)限,則元素顯示。 - 如果傳入
['user:write']
,當(dāng)前用戶沒有該權(quán)限,則元素被移除
完整流程回顧
- 定義
permission
指令:判斷權(quán)限并移除無(wú)權(quán)限的元素。 - 注冊(cè)指令:在
main.ts
中注冊(cè)全局指令。 - 使用指令:在模板中使用
v-permission
,傳入所需權(quán)限數(shù)組。 - 支持動(dòng)態(tài)更新:元素更新時(shí)會(huì)重新檢查權(quán)限。
注意事項(xiàng)
store.getters
配置:確保權(quán)限數(shù)據(jù)正確配置在 Vuex 中,并返回一個(gè)數(shù)組格式。- 傳參校驗(yàn):
v-permission
綁定的值必須是數(shù)組,否則會(huì)拋出錯(cuò)誤。 - 動(dòng)態(tài)權(quán)限變化:如果權(quán)限列表動(dòng)態(tài)更新,需要確保頁(yè)面重新渲染或觸發(fā)指令的
updated
鉤子。
總結(jié)
通過 v-permission
自定義指令,可以在 Vue3 項(xiàng)目中輕松實(shí)現(xiàn)權(quán)限控制,移除無(wú)權(quán)限的元素,提升用戶體驗(yàn)和項(xiàng)目安全性。根據(jù)實(shí)際需求,還可以進(jìn)一步擴(kuò)展此指令,例如實(shí)現(xiàn)隱藏元素而非移除元素、支持多種權(quán)限邏輯等。
到此這篇關(guān)于Vue3如何自定義v-permission權(quán)限指令的文章就介紹到這了,更多相關(guān)Vue3 v-permission指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在Vue3中創(chuàng)建和使用全局組件的實(shí)現(xiàn)方式
在前端開發(fā)中,Vue.js 是一個(gè)廣泛使用的框架,因其靈活性和強(qiáng)大的功能,得到許多開發(fā)者的喜愛,Vue 3 的發(fā)布為這一框架帶來(lái)了很多新的特性和改進(jìn),在本文中,我們將詳細(xì)討論如何在 Vue 3 中創(chuàng)建和使用全局組件,并通過示例代碼展示具體實(shí)現(xiàn)方式,需要的朋友可以參考下2024-07-07解決Vue數(shù)據(jù)更新了但頁(yè)面沒有更新的問題
在vue項(xiàng)目中,有些我們會(huì)遇到修改完數(shù)據(jù),但是視圖卻沒有更新的情況,具體的場(chǎng)景不一樣,解決問題的方法也不一樣,在網(wǎng)上看了很多文章,在此總結(jié)匯總一下,需要的朋友可以參考下2023-08-08解決vue-router中的query動(dòng)態(tài)傳參問題
下面小編就為大家分享一篇解決vue-router中的query動(dòng)態(tài)傳參問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-03-03vue使用百度地圖報(bào)錯(cuò)BMap?is?not?defined問題及解決
這篇文章主要介紹了vue使用百度地圖報(bào)錯(cuò)BMap?is?not?defined問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue iview多張圖片大圖預(yù)覽、縮放翻轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了vue iview多張圖片大圖預(yù)覽、縮放翻轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07vue項(xiàng)目?jī)煞N方式實(shí)現(xiàn)豎向表格的思路分析
這篇文章主要介紹了vue項(xiàng)目?jī)煞N方式實(shí)現(xiàn)豎向表格的思路分析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04vue3 emit is not a function問題及解決
這篇文章主要介紹了vue3 emit is not a function問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09