在后台管理系统中,我们常常除了动态菜单的权限还需要控制按钮的权限

一般我们是通过当前登录的用户这个角色有哪些权限,如果没有该按钮的权限就隐藏,也就是说通过按钮的显示隐藏来做权限控制(例如:a没有某个页面的增删改的权限,只有查询权限,那么增删改的按钮就不会显示)

我们常常会写自定义指令来实现这个功能

首先新建一个plugin的文件夹(这是我用来写全局自定义指令,混入,过滤器的文件夹,你们自己看情况)

//main.js引用
//全局使用自定义插件
import plugin from '@/plugin'
Vue.use(plugin)

//plugin/index
import registerFilters from './filter'
import registerMixins from './mixin'
import registerDirective from './directive'export default {install(Vue){registerMixins(Vue)registerFilters(Vue)registerDirective(Vue)}
}

别的就不看了,直接来看指令(之前写法)

//plugin/directive
import Vue from "vue"
let directives = {hasPermi(el, binding, vnode) {const { value } = binding//从缓存拿到按钮权限数组(也有放在vuex里面的)let permissions = Vue.ls.get("userInfo").permissionslet hasPermissions = permissions.some(item => value.includes(item))if (!hasPermissions) {el.parentNode && el.parentNode.removeChild(el)}}
}export default function registerDirective(Vue) {Object.keys(directives).forEach(key => {Vue.directive(key, directives[key])})
}

然后在页面中使用

<a-buttontype="primary"@click="handleAdd"icon="plus"v-hasPermi="['acl:menu:add']">新增</a-button>

然后在菜单管理中把这个权限取消,发现这个按钮只是有时候消失,这显然不对
排查代码打印发现也没有问题,然后也走到if (!hasPermissions)这个判断里了,那显然就是没有删除掉这个标签,打印el.parentNode发现竟然是null

有问题找百度
原来是钩子函数的问题

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

unbind:只调用一次,指令与元素解绑时调用。

后来做了改动,使用inserted成功了

//plugin/directive
import Vue from "vue"
let directives = {hasPermi: {inserted: function (el, binding, vnode) {const { value } = bindinglet permissions = Vue.ls.get("userInfo").permissionslet hasPermissions = permissions.some(item => value.includes(item))if (!hasPermissions) {el.parentNode && el.parentNode.removeChild(el)}}}
}export default function registerDirective(Vue) {Object.keys(directives).forEach(key => {Vue.directive(key, directives[key])})
}

使用自定义指令el.parentNode为null相关推荐

  1. 【vue3】el-input 的获取焦点——el挂载:自定义指令,focus使 input 获取焦点(el-input 的Input Methods)

    参考网址: (适用vue2)让element-ui的输入框聚焦的4种方式 ElementUI:使input自动聚焦的两种方法 使el-form中的el-input自动获取焦点 在vue3中,保留了自定 ...

  2. vue-cli 自定义指令directive 添加验证滑块

    欢迎加入前端交流群来获取视频资料以及前端学习资料:749539640 ----------------------------------------------------------       ...

  3. clientsideevents能定义几个click事件_分享8个非常实用的Vue自定义指令

    作者:lzg9527 https://juejin.cn/post/6906028995133833230 在 Vue,除了核心功能默认内置的指令 ( v-model 和 v-show ),Vue 也 ...

  4. vue 自定义指令_vue 自定义指令

    <template><div><div class="movebox"><div class="movego"> ...

  5. vue 全局动态修改title、keywords、description;vue常用挂载的方法,自定义指令;

    vue 全局动态修改title.keywords.description 路由: {path: "xxx",name: "xxx",component: () ...

  6. vue点击改变data值_vue 中自定义指令改变data中的值

    通过局部自定义指令实现了一个拖动的指令 html: script: methods:{ set(x,y){ this.data.x=x; this.data.y=y; } }, directives: ...

  7. vue自定义指令截取图片中心显示

    使用vue做项目时,有一种产品需求,是像朋友圈一样展示图片,在小图时,只展示中心的一部分图片 在vue中可以用自定义指令来做 页面代码 <div class="image-item&q ...

  8. vue 图片拖动加载 类似于地图_前端性能优化之图片懒加载(附vue自定义指令)...

    作者:lzg9527 链接:https://juejin.cn/post/6903774214780616718 在类电商类项目,往往存在大量的图片,如 banner 广告图,菜单导航图,美团等商家列 ...

  9. vue 自定义指令(directive)实例

    一.内置指令 1.v-bind:响应并更新DOM特性:例如:v-bind:href  v-bind:class  v-bind:title  v-bind:bb 2.v-on:用于监听DOM事件: 例 ...

最新文章

  1. 后端传给前端 无限极分类_学徒|记者亲身体验垃圾分拣,臭到崩溃!我们还有什么理由不做垃圾分类?...
  2. Laravel - Auth验证流程以及guard守卫和自定义驱动driver驱动,使用web-token验证
  3. 计算机组成原理【随堂练习】
  4. idea怎么把代码放到git_在IDEA中如何初始化Git,把项目推送到Git上
  5. 美国计算机协会ACM子刊中国特辑:中国的人工智能初创企业
  6. mysql 5.1 db2i_DB2 9.5.0.0升级至9.5.0.9(小版本升级)
  7. 蓝桥杯2015年第六届C/C++A组国赛第四题-穿越雷区
  8. 20170908在线编程之圆周上问两点间的距离问题
  9. /usr/bin/ssh-copy-id: ERROR: ssh: Could not resolve hostname 192.168.0.114:root/.ssh/authorized_keys
  10. mysql 重置密码_mysql忘记密码如何重置密码,以及修改root密码的三种方法
  11. 第四章——权限提升分析及防御
  12. 用 BCDEdit 命令修改 Windows 多系统启动菜单的名称及显示顺序
  13. MAX708SCUA
  14. Angular2组件与Echarts饼状图交互之饼图制作
  15. linux串口读取 GPS模块程序
  16. 原生JS实现——flappy bird 像素小鸟 项目总结
  17. 软件测试一个吃青春饭的工作?
  18. Maya——1——在maya中,用Arnold(阿诺德)还原Subtance Painter(sp)中的材质效果。
  19. 华为运营商级路由器配置示例 | L3VdPdNd over OSPF SR-MPLS BE
  20. 低代码可视化开发理念在物联网APP开发中的应用

热门文章

  1. 「虚幻引擎5」为何让开发者们拍手叫好?它到底厉害在哪?
  2. 基于Python Unet的医学影像分割系统源码,含皮肤病的数据及皮肤病分割的模型,用户输入图像,模型可以自动分割去皮肤病的区域
  3. 云栖科技评论第7期:奥巴马力推无人驾驶合法化
  4. 数据挖掘-数据挖掘综述-基础知识和概念总结
  5. 关系型数据库小结-基础-易理解!
  6. MySQL中存储过程使用详解
  7. VBA常用小代码:在单元格中批量插入图片
  8. 黄飞宏老师---沪师经纪刘建
  9. CSDN社区投诉申请表
  10. js websocket建立连接时发送token给后端发送不了