vue使用自定義指令來控制頁面按鈕組的權(quán)限思想
自定義指令來控制頁面按鈕組的權(quán)限思想
在vuejs中, 我們可以自定義一些指令,來控制一些按鈕加載之前的動作, 比如現(xiàn)有的 v-if 或者 v-show
這些功能是我們可以手寫的, 現(xiàn)在們來做一個(gè)初級的頁面級的權(quán)限控制的例子
<template> ? <div class="table-wrapper"> ? ? <div class="action-bar"> ? ? ?? ?//v-hasProm ?指令是說 如果指令中value 包含在 data.promission 數(shù)組中, 就把這個(gè)按鈕顯示出來? ? ? ? <el-button v-has-prom="'admin.goods.edit'" type="success" icon="el-icon-plus" @click.native = "$router.push('/makeform/create')">新建</el-button> ? </div> </template>
<script> export default { ? name: "FromList", ? //這里添加了一個(gè)局部指令 (只作用于本面頁) ? directives:{ ? ? hasProm:{ ? ? ? inserted(el,binding,vnode){ ? ? ? ? console.log(el,binding,vnode); ? ? ? ? //這里要說一下 這三個(gè)參數(shù) ? ? ? ? // el就是 指令所在的 元素(element) ? 我們可以使用 ?el.style.dispaly='none' 來對el 的css進(jìn)行設(shè)置 ? ? ? ? //binding 是指的binding 的信息, 其中可以得到我們 v-hasProm = value 中的 ?value值 ? ? ? ? //vnode 就是指的虛擬節(jié)點(diǎn), 我們可以通過它, 得到當(dāng)前頁面中的 ?component.data 中的數(shù)據(jù) 也就是promission 數(shù)組長 ?頁面的 this 在指令中是得不到了, 我們能過 ?vnode.context得到的就是 this ?? ??? ?//看一下代碼 ?? ??? ?let bindvalue = binding.value; ? ?//bindvalue 的值是'admin.goods.edit' ?? ??? ?let promissionArr = vnode.context.promission; ?? ??? ?let p = promissionArr.find((item)=>{ ?? ??? ??? ?return item == bindvalue; ?? ??? ?}) ?? ??? ?if(p == undefined){ ?? ??? ??? ?//說明在數(shù)組中沒有這個(gè)權(quán)限, 把這個(gè)元素給隱藏 ?? ??? ??? ?el.style.display="none" ?? ??? ?} ?? ??? ? ? ? ? } ? ? } ? }, ? data(){ ? ? return { ? ? ?? ?promission:["admin.goods.add","admin.goods.edit","admin.goods.delete"] ? ? ?? ?//上面的權(quán)限更表 以字符串開式, 這個(gè)其實(shí)可以從后端獲取得到, 然后放在store中, 全局可使用, 這里就寫在data中算了 ? ? } ? }, ? created() { ? }, ? methods:{ ? } } </script> <style scoped> </style>
上面的代碼, 主要要注意 自定義指令的參數(shù), 都可以獲得什么有用的數(shù)據(jù)。
vue添加按鈕權(quán)限~通過自定義指令
1、需求
客戶:需要把導(dǎo)入、刪除權(quán)限化;指定人員有權(quán)限;
2、思路
后臺有一個(gè)接口,是可以查詢到當(dāng)前登錄人的權(quán)限;
前端方案:
1.每到一個(gè)頁面就請求一次接口是否有權(quán)限;(太麻煩了)
2.自定義指令 · Vue.directive;(一次請求,一直用)
3、代碼實(shí)現(xiàn)
1.自定義指令
創(chuàng)建 /directive/permission/hasPermi 文件
//用來獲取權(quán)限數(shù)據(jù) import store from '@/store' ? export default { ? ? inserted(el, binding, vnode) { ? ? //獲取綁定值 ? ? const { value } = binding ? ? // TODO 匹配規(guī)則,在頁面寫的要對應(yīng)這個(gè)匹配規(guī)則 ? ? const all_permission = "*:*:*"; ? ? //獲取用戶權(quán)限數(shù)據(jù) ? ? const permissions = store.getters && store.getters.permissions? if (value && value instanceof Array && value.length > 0) {? ? ? ? //權(quán)限標(biāo)志 ? ? ? const permissionFlag = value ? ? ? //判斷用戶是否有此權(quán)限 ? ? ? const hasPermissions = permissions.some(permission => { ? ? ? ? console.log('permission', permission); ? return all_permission === permission || permissionFlag.includes(permission) ? ? ? }) ? ? ?? ? ? ? //沒有權(quán)限-移除頁面上的控件 ? ? ? if (!hasPermissions) {{ ? ? ? ? console.log('沒有權(quán)限-移除'); ? ? ? ? el.parentNode && el.parentNode.removeChild(el) ? ? ? } ? ? } else {? ? ? ? el.parentNode && el.parentNode.removeChild(el) ? ? ? throw new Error(`請?jiān)O(shè)置數(shù)組操作權(quán)限`) ? ? } ? } }
2.注冊指令
創(chuàng)建 /directive/permission/index文件
import hasPermi from './hasPermi' import Vue from "vue" ? ? const install = function (Vue) { ? Vue.directive('hasPermi', hasPermi) } ? ? if (window.Vue) { ? window['hasPermi'] = hasPermi ? Vue.use(install); } ? export default install
3.在main.js里面進(jìn)行全局注冊
import permission from './directive/permission' ? ? Vue.use(permission)
vue官網(wǎng)對指令的解釋
https://cn.vuejs.org/v2/guide/custom-directive.html
4.使用方法
? ? ? <button ? ? ? ? ? ?v-has-permi="['btn:pre:del']" ? ? ? ? ? ?style="margin-top: 4px"/> ? ? ? ?<button ? ? ? ? ? ?v-has-permi="['btn:pre:export']" ? ? ? ? ? ?style="margin-top: 4px"/>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何使用sm4js進(jìn)行加密和國密sm4總結(jié)
近期由于公司項(xiàng)目的需要開始研究國密SM4加密,下面這篇文章主要給大家介紹了關(guān)于如何使用sm4js進(jìn)行加密和國密sm4的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04vue.js移動端tab組件的封裝實(shí)踐實(shí)例
本篇文章主要介紹了vue.js移動端tab的封裝實(shí)踐實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06vue jsx 使用指南及vue.js 使用jsx語法的方法
這篇文章主要介紹了vue jsx 使用指南及vue.js 使用jsx語法的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11Monaco?Editor開發(fā)SQL代碼提示編輯器實(shí)例詳解
這篇文章主要為大家介紹了Monaco?Editor開發(fā)SQL編輯器實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08vue3+ts中ref與reactive指定類型實(shí)現(xiàn)示例
這篇文章主要為大家介紹了vue3+ts中ref及reactive如何指定類型的實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Vue利用自定義指令實(shí)現(xiàn)按鈕權(quán)限控制
這篇文章主要為大家詳細(xì)介紹了Vue如何利用自定義指令實(shí)現(xiàn)按鈕權(quán)限控制效果,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的可以參考下2023-05-05