Vue3如何自定義指令directive(如權(quán)限控制)
Vue3自定義指令directive
1.創(chuàng)建src/directives/index.ts文件
//@ts-nocheck import { Directive } from "vue"; import { permission } from "@/directives/permission.ts"; const allGlobalDirectives = { permission }; // console.log(allGlobalDirectives, "allGlobalDirectives"); //打印發(fā)現(xiàn)是導(dǎo)出的自定義指令名,permission export default { install(app) { Object.keys(allGlobalDirectives).forEach(key => { //Object.keys() 返回一個(gè)數(shù)組,值是所有可遍歷屬性的key名 app.directive(key, (allGlobalDirectives as { [key: string]: Directive })[key]); //key是自定義指令名字;后面應(yīng)該是自定義指令的值,值類型是string }); } };
2.創(chuàng)建src/directives/permission.ts文件
import type { DirectiveBinding } from 'vue' export const permission = (el: HTMLElement, binding: DirectiveBinding) => { // value 獲取用戶使用自定義指令綁定的內(nèi)容 const {value} = binding; // 獲取用戶所有的權(quán)限按鈕 // const permissionBtn = sessionStorage.getItem("permission"); const permissionBtn = ["user.add23"]; // 判斷用戶使用自定義指令,是否使用正確了 if (value && value instanceof Array && value.length > 0) { const permissionFunc = value; //判斷傳遞進(jìn)來(lái)的按鈕權(quán)限,用戶是否擁有 //Array.some(), 數(shù)組中有一個(gè)結(jié)果是true返回true,剩下的元素不會(huì)再檢測(cè) const hasPermission = permissionBtn.some((role: any) => { return permissionFunc.includes(role); }); console.log("hasPermission", value, hasPermission); // 當(dāng)用戶沒有這個(gè)按鈕權(quán)限時(shí),設(shè)置隱藏這個(gè)按鈕 if (!hasPermission) { el.style.display = "none"; } } else { throw new Error("need roles! Like v-permission=\"['admin','editor']\""); } };
3.main.ts引入
// 引入自定義插件對(duì)象:注冊(cè)全局組件 import globalDirectives from "@/directives/index.ts"; const app = createApp(App); // 安裝自定義指令 app.use(globalDirectives); app.mount("#app");
4.頁(yè)面中使用
<span v-permission="['user.add']" class="padding-right-20">測(cè)試</span>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解如何創(chuàng)建并發(fā)布一個(gè) vue 組件
這篇文章主要介紹了詳解如何創(chuàng)建并發(fā)布一個(gè)vue組件,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-11-11Vue程序化的事件監(jiān)聽器(實(shí)例方案詳解)
本文通過兩種方案給大家介紹了Vue程序化的事件監(jiān)聽器,每種方案通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-01-01Vue中v-show添加表達(dá)式的問題(判斷是否顯示)
這篇文章主要介紹了關(guān)于Vue中v-show中添加表達(dá)式用于判斷是否顯示的問題,很多朋友經(jīng)常會(huì)遇到這樣的需求,有數(shù)據(jù)來(lái)源和標(biāo)簽類型兩行選項(xiàng),需要實(shí)現(xiàn)點(diǎn)擊上面的某個(gè)數(shù)據(jù)來(lái)源時(shí),標(biāo)簽類型自動(dòng)切換功能,感興趣的朋友一起看看吧2018-03-03ant design vue datepicker日期選擇器中文化操作
這篇文章主要介紹了ant design vue datepicker日期選擇器中文化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-10-10Vue之el-select結(jié)合v-if動(dòng)態(tài)控制template顯示隱藏方式
這篇文章主要介紹了Vue之el-select結(jié)合v-if動(dòng)態(tài)控制template顯示隱藏方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04vue使用axios實(shí)現(xiàn)文件上傳進(jìn)度的實(shí)時(shí)更新詳解
最近在學(xué)習(xí)axios,然后項(xiàng)目就用到了,所以這篇文章主要給大家介紹了關(guān)于vue中利用axios實(shí)現(xiàn)文件上傳進(jìn)度的實(shí)時(shí)更新的相關(guān)資料,文中先對(duì)axios進(jìn)行了簡(jiǎn)單的介紹,方法大家理解學(xué)習(xí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12基于Vue3與免費(fèi)滿血版DeepSeek實(shí)現(xiàn)無(wú)限滾動(dòng)+懶加載+瀑布流模塊及優(yōu)化過程
在進(jìn)行非完全標(biāo)準(zhǔn)化數(shù)據(jù)的可視化展示時(shí),瀑布流是一種經(jīng)常被采用的展示方法,瀑布流能夠有效地將不同大小規(guī)格的內(nèi)容以一種相對(duì)規(guī)整的方式呈現(xiàn)出來(lái),本文給大家介紹了基于Vue3與免費(fèi)滿血版DeepSeek實(shí)現(xiàn)無(wú)限滾動(dòng)+懶加載+瀑布流模塊,需要的朋友可以參考下2025-03-03vue backtop組件的實(shí)現(xiàn)完整代碼
這篇文章主要介紹了vue backtop組件的實(shí)現(xiàn)完整代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Vue按照順序?qū)崿F(xiàn)多級(jí)彈窗效果 附Demo
這篇文章主要介紹了Vue按照順序?qū)崿F(xiàn)多級(jí)彈窗效果 附Demo,通過實(shí)例代碼介紹了單個(gè)彈窗和多級(jí)彈窗的實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起看看吧2024-05-05vue前端測(cè)試開發(fā)watch監(jiān)聽data的數(shù)據(jù)變化
這篇文章主要為大家介紹了vue測(cè)試開發(fā)watch監(jiān)聽data的數(shù)據(jù)變化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05