Vue自定义v-has指令,做按钮权限判断的步骤

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Vue⾃定义v-has指令,做按钮权限判断的步骤

⽬录

应⽤场景

简单说⼀下,⾃定义指令

基础概念

全局⾃定义

局部⾃定义

钩⼦函数

其他

原理

⾃定义指令v-has

utils⽂件下的index.js

main.js中引⼊

组件中使⽤v-has根据按钮权限,判断是否显⽰该按钮

应⽤场景

以后台管理系统为例,每个⽤户所拥有的按钮权限不⼀样。管理员配置权限之后,⽤户登录时,从接⼝拿到按钮权限列表,然后根据后台数据判断显⽰哪些按钮。

简单说⼀下,⾃定义指令

Vue.js官⽹关于⾃定义指令的讲解

基础概念

Vue除了核⼼功能默认内置的指令(v-model和v-show)还可以注册⾃定义指令。

在Vue2.0中,代码复⽤和抽象的主要形式是组件。但有的情况下,仍需要对普通DOM元素进⾏底层操作,这时候就会⽤到⾃定义指令。

譬如,⾃定义⼀个v-focus指令,当页⾯加载时,输⼊框将获得焦点

<input v-focus>

全局⾃定义

// 注册⼀个全局⾃定义指令 `v-focus`

Vue.directive('focus', {

// 当被绑定的元素插⼊到 DOM 中时……

inserted: function (el) {

// 聚焦元素

el.focus()

}

})

局部⾃定义

//如果想注册局部指令,组件中也接受⼀个 directives 的选项:

directives: {

focus: {

// 指令的定义

inserted: function (el) {

el.focus()

}

}

}

钩⼦函数

⼀个指令定义对象可以提供如下⼏个钩⼦函数(均为可选)

bind

只调⽤⼀次,指令第⼀次绑定到元素时调⽤。在这⾥可以进⾏⼀次性的初始化设置。

inserted

被绑定元素插⼊⽗节点时调⽤(仅保证⽗节点存在,但不⼀定已被插⼊⽂档中)

update

所在组件的VNode更新时调⽤,但是可能发⽣在其⼦VNode更新之前。指令的值可能发⽣了改变,也可能没有。但是你可以通过⽐较更新前后的值来忽略不必要的模板更新。

componentUpdated

指令所在组件的VNode及其⼦VNode全部更新后调⽤。

unbind

只调⽤⼀次,指令与元素解绑时调⽤。

其他

除此之外,还有⼀些基础概念,钩⼦函数参数,动态指令参数,等等。

官⽹讲的⼗分清楚,在此不再多做赘述。

原理

如果对⾃定义指令的源码感兴趣,也有⼀篇⽂章讲的很通透

原理就是:

解析Vue的属性的时候,遍历每个属性;

对象上增加⼀个directives属性保存指令信息;

渲染完成后会执⾏directives模块的create钩⼦函数;

Vue 编译⽣成的虚拟节点,也就是VNode插⼊到⽗节点后,

依次执⾏每个函数,也就执⾏到我们⾃定义定义的inserted钩⼦函数了

⾃定义指令v-has

话休絮烦,⾔归正传。

今天主要是总结⼀下:⾃定义指令v-has,按钮权限判断

登录接⼝拿到按钮权限列表,存⼊本地缓存LOGIN_USER_BUTTON_AUTH中

数据格式如下:

[

{

"checked":false,

"component":"",

"createTime":"2019-06-29 18:21:06",

"createUser":"026a564bbfd84861ac4b65393644beef",

"icon":"",

"id":"1503273153861066776",

"name":"今⽇采集(案卷)",

"open":"true",

"parentId":"2328050996633395469",

"parentName":"⾸页",

"permission":"sys:index:vol",

"sort":103,

"status":"0",

"type":"2",

"updateTime":"2021-01-27 15:51:15",

"updateUser":"026a564bbfd84861ac4b65393644beef",

"url":""

}

]

⾃定义v-has指令的配置

在utils⽂件夹下,新建hasPermission.js⽂件,在index.js中统⼀导出

const hasPermission = {

install (Vue, options) {

Vue.directive('has', {

inserted: (el, binding, vnode)=>{

filterGlobalPermission(el, binding, vnode);

}

});

}

};

/**

* 全局权限控制

*/

export const filterGlobalPermission = (el, binding, vnode) => {

let permissionList = [];

let authList = JSON.parse(localStorage.getItem('LOGIN_USER_BUTTON_AUTH') || "[]");

for (let auth of authList) {

permissionList.push(auth);

}

if (!permissionList.length) {

el.parentNode.removeChild(el);

return;

}

let permissions = [];

for (let item of permissionList) {

permissions.push(item.permission);

}

if (!permissions.includes(binding.value)) {

el.parentNode.removeChild(el);

}

}

export default hasPermission;

utils⽂件下的index.js

utils⽂件夹下的其他js⽂件也可以统⼀在index.js⾥导出

import hasPermission from './hasPermission'

export { hasPermission }

main.js中引⼊

import { hasPermission } from '@/utils'

e(hasPermission)

组件中使⽤v-has根据按钮权限,判断是否显⽰该按钮

<el-button v-has="'sys:arch:add'" type="primary" size="mini" icon="el-icon-plus" @click="add('1')">

新增

</el-button>

以上就是Vue⾃定义v-has指令,做按钮权限判断的步骤的详细内容,更多关于Vue ⾃定义v-has指令的资料请关注其它相关⽂章!

相关文档
最新文档