欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3如何自定義v-permission權限指令

 更新時間:2024年12月13日 11:34:00   作者:頭發(fā)禿頭小寶貝  
這篇文章主要為大家詳細介紹了Vue3如何編寫一個?v-permission?指令來根據(jù)用戶權限動態(tài)控制元素的渲染,感興趣的小伙伴可以參考一下

在 Vue3 + TypeScript 項目中,可以通過自定義指令來控制元素的顯示與隱藏,實現(xiàn)權限管理功能。本文將詳細介紹如何編寫一個 v-permission 指令來根據(jù)用戶權限動態(tài)控制元素的渲染。

功能概述

v-permission 是一個自定義指令,作用如下:

  • 傳入一個權限數(shù)組,例如 ['OrderList']
  • 從 Vuex 中獲取用戶擁有的權限列表。
  • 如果用戶沒有指定權限,則從 DOM 中移除對應元素。
  • 支持動態(tài)更新,通過 updated 鉤子重新檢查權限。

實現(xiàn)步驟

1. 新建 directives/permission.ts

在項目的 directives 目錄下新建 permission.ts,內容如下:

import { App, DirectiveBinding } from 'vue';
import store from '@/store';

// 判斷是否有權限
const hasPermission = (value: Array<string>, el: Element) => {
  // 檢查是否配置了權限參數(shù)
  if (!Array.isArray(value) || value.length === 0) {
    throw new Error(`v-permission 需要配置權限,例如 v-permission="['xxx']"`);
  }

  // 獲取用戶權限
  const ruleNames: Array<string> = store.getters['menu/getRuleNames'] || [];
  if (!Array.isArray(ruleNames)) {
    console.warn('權限數(shù)據(jù) "menu/getRuleNames" 格式不正確,請檢查 store 配置。');
    return;
  }

  // 判斷是否有權限
  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 鉤子:元素掛載時檢查權限,如果沒有權限,移除元素。
  • updated 鉤子:元素或綁定值更新時重新檢查權限。
  • 錯誤提示:當傳入的值不正確時,拋出錯誤或給出警告。
  • store.getters['menu/getRuleNames'] :假設從 Vuex 中獲取用戶權限列表,返回一個字符串數(shù)組。

2. 在 main.ts 中引入指令

main.ts 文件中注冊該指令:

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); // 注冊自定義指令
app.mount('#app');

3. 使用 v-permission 指令

在模板中使用 v-permission 指令,傳入權限數(shù)組:

<template>
  <div>
    <!-- 用戶擁有 'OrderList'權限時顯示 -->
    <button v-permission="['OrderList']">有權限的按鈕</button>

    <!-- 僅管理員權限時顯示 -->
    <div v-permission="['admin']">僅管理員可見內容</div>
  </div>
</template>

4.權限數(shù)據(jù)說明

假設 store.getters['menu/getRuleNames'] 返回如下權限數(shù)組:

['OrderList', 'admin', 'user:read']

  • 如果傳入 ['admin'],當前用戶擁有該權限,則元素顯示。
  • 如果傳入 ['user:write'],當前用戶沒有該權限,則元素被移除

完整流程回顧

  • 定義 permission 指令:判斷權限并移除無權限的元素。
  • 注冊指令:在 main.ts 中注冊全局指令。
  • 使用指令:在模板中使用 v-permission,傳入所需權限數(shù)組。
  • 支持動態(tài)更新:元素更新時會重新檢查權限。

注意事項

  • store.getters 配置:確保權限數(shù)據(jù)正確配置在 Vuex 中,并返回一個數(shù)組格式。
  • 傳參校驗v-permission 綁定的值必須是數(shù)組,否則會拋出錯誤。
  • 動態(tài)權限變化:如果權限列表動態(tài)更新,需要確保頁面重新渲染或觸發(fā)指令的 updated 鉤子。

總結

通過 v-permission 自定義指令,可以在 Vue3 項目中輕松實現(xiàn)權限控制,移除無權限的元素,提升用戶體驗和項目安全性。根據(jù)實際需求,還可以進一步擴展此指令,例如實現(xiàn)隱藏元素而非移除元素、支持多種權限邏輯等。

到此這篇關于Vue3如何自定義v-permission權限指令的文章就介紹到這了,更多相關Vue3 v-permission指令內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在Vue3中創(chuàng)建和使用全局組件的實現(xiàn)方式

    在Vue3中創(chuàng)建和使用全局組件的實現(xiàn)方式

    在前端開發(fā)中,Vue.js 是一個廣泛使用的框架,因其靈活性和強大的功能,得到許多開發(fā)者的喜愛,Vue 3 的發(fā)布為這一框架帶來了很多新的特性和改進,在本文中,我們將詳細討論如何在 Vue 3 中創(chuàng)建和使用全局組件,并通過示例代碼展示具體實現(xiàn)方式,需要的朋友可以參考下
    2024-07-07
  • 深入理解Vue的數(shù)據(jù)響應式

    深入理解Vue的數(shù)據(jù)響應式

    Vue.js的核心包括一套“響應式系統(tǒng)”?!绊憫健保侵府敂?shù)據(jù)改變后,Vue會通知到使用該數(shù)據(jù)的代碼。例如,視圖渲染中使用了數(shù)據(jù),數(shù)據(jù)改變后,視圖也會自動更新。
    2021-05-05
  • 7個適用于Vue?3的高顏值UI組件庫

    7個適用于Vue?3的高顏值UI組件庫

    這篇文章主要給大家分享介紹了7個適用于Vue?3的高顏值UI組件庫,合理利用,又或者學習借鑒都是不錯的選擇,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • 解決Vue數(shù)據(jù)更新了但頁面沒有更新的問題

    解決Vue數(shù)據(jù)更新了但頁面沒有更新的問題

    在vue項目中,有些我們會遇到修改完數(shù)據(jù),但是視圖卻沒有更新的情況,具體的場景不一樣,解決問題的方法也不一樣,在網(wǎng)上看了很多文章,在此總結匯總一下,需要的朋友可以參考下
    2023-08-08
  • 解決vue-router中的query動態(tài)傳參問題

    解決vue-router中的query動態(tài)傳參問題

    下面小編就為大家分享一篇解決vue-router中的query動態(tài)傳參問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • vue使用百度地圖報錯BMap?is?not?defined問題及解決

    vue使用百度地圖報錯BMap?is?not?defined問題及解決

    這篇文章主要介紹了vue使用百度地圖報錯BMap?is?not?defined問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue.js實現(xiàn)三級菜單效果

    vue.js實現(xiàn)三級菜單效果

    這篇文章主要為大家詳細介紹了vue.js實現(xiàn)三級菜單效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • vue iview多張圖片大圖預覽、縮放翻轉

    vue iview多張圖片大圖預覽、縮放翻轉

    這篇文章主要為大家詳細介紹了vue iview多張圖片大圖預覽、縮放翻轉,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • vue項目兩種方式實現(xiàn)豎向表格的思路分析

    vue項目兩種方式實現(xiàn)豎向表格的思路分析

    這篇文章主要介紹了vue項目兩種方式實現(xiàn)豎向表格的思路分析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • vue3 emit is not a function問題及解決

    vue3 emit is not a function問題及解決

    這篇文章主要介紹了vue3 emit is not a function問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09

最新評論