背景:對于前臺中通過指令對于操作按鈕的控制是怎么實現的:
<el-col :span="1.5"><el-buttontype="primary"plainicon="Plus"@click="handleAdd"v-hasPermi="['system:role:add']">新增</el-button></el-col><el-col :span="1.5"><el-buttontype="success"plainicon="Edit":disabled="single"@click="handleUpdate"v-hasPermi="['system:role:edit']">修改</el-button></el-col>
v-hasPermi
是一個自定義指令,用于控制組件的顯示或隱藏。這個指令通常用于基于用戶權限來動態顯示或隱藏頁面元素。在你的例子中,v-hasPermi="['monitor:job:add']"
表示只有當用戶擁有 monitor:job:add
權限時,這個按鈕才會顯示。
具體實現方式可能因項目而異,但通常包括以下幾個步驟:
- 定義指令:在 Vue 項目中定義一個全局指令,比如
v-hasPermi
,用于檢查用戶權限。 - 獲取用戶權限:在用戶登錄時,從后端獲取用戶的權限信息,并存儲在 Vuex 或其他狀態管理工具中。
- 指令邏輯:在
v-hasPermi
指令中,根據用戶權限信息判斷是否顯示元素。
以下是一個簡單的示例,展示如何實現 v-hasPermi
指令:
整體過程:
src\directive\permission\hasPermi.js
/*** v-hasPermi 操作權限處理* Copyright (c) 2019 ruoyi*/import useUserStore from '@/store/modules/user'export default {mounted(el, binding, vnode) {const { value } = bindingconst all_permission = "*:*:*";const permissions = useUserStore().permissionsif (value && value instanceof Array && value.length > 0) {const permissionFlag = valueconst hasPermissions = permissions.some(permission => {return all_permission === permission || permissionFlag.includes(permission)})if (!hasPermissions) {el.parentNode && el.parentNode.removeChild(el)}} else {throw new Error(`請設置操作權限標簽值`)}}
}
解釋一下:其中的父節點的概念:
在這個 Vue 組件中, 元素的父節點 DOM 是 元素。
具體來說:
是一個按鈕元素,它被 v-hasPermi 指令和幾個其他屬性(如 type、plain、icon、@click)修飾。
是一個來自 Element UI 庫的列元素,它使用 :span=“1.5” 屬性來定義列的寬度。
因此, 的父節點是 ,而 的父節點是 或
定義完之后,需要去注冊自定義指令到VUE應用中
import hasRole from './permission/hasRole'
import hasPermi from './permission/hasPermi'
import copyText from './common/copyText'export default function directive(app){app.directive('hasRole', hasRole)app.directive('hasPermi', hasPermi)app.directive('copyText', copyText)
}
這段代碼定義了一個函數 directive,它接收一個參數 app,通常這個 app 是 Vue 的實例。這個函數的作用是注冊一些自定義指令到 Vue 應用中。
具體來說,這段代碼注冊了三個自定義指令:
hasRole:這個指令用于基于用戶角色來控制組件的顯示或隱藏。
hasPermi:這個指令用于基于用戶權限來控制組件的顯示或隱藏。
copyText:這個指令用于實現文本的復制功能。
每個指令的具體實現邏輯會在 hasRole、hasPermi 和 copyText 函數中定義。這些函數通常會接收一些參數,比如指令綁定的值、元素、虛擬節點等,然后根據這些參數來實現特定的功能。
在vue頁面組件中使用:
<el-col :span="1.5"><el-buttontype="primary"plainicon="Plus"@click="handleAdd"v-hasPermi="['system:role:add']">新增</el-button></el-col><el-col :span="1.5"><el-buttontype="success"plainicon="Edit":disabled="single"@click="handleUpdate"v-hasPermi="['system:role:edit']">修改</el-button></el-col>
實現顯隱的原理:
在這段代碼中,el 是一個 DOM 元素,el.parentNode 是獲取這個 DOM 元素的父節點。
具體來說:
el:這是指令綁定的元素,即當前正在處理的元素。
el.parentNode:這是獲取 el 的父節點。父節點是包含當前元素的 DOM 元素。
el.parentNode && el.parentNode.removeChild(el) 這行代碼的意思是,如果 el.parentNode 存在(即 el 有父節點),則從 DOM 中移除 el。
這是因為在 Vue 中,使用 v-hasPermi 指令時,如果用戶沒有相應的權限,我們希望從 DOM 中移除這個元素,從而避免用戶看到沒有權限的按鈕或鏈接。