vue 自定义指令

灰太狼 2022-11-04 12:29 336阅读 0赞

项目中使用指令的情景是“有无权限”

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMDU1MjAw_size_16_color_FFFFFF_t_70

// 指令的代码

  1. Vue.directive('pIndex', {
  2. bind (el,binding, vnode) {
  3. var clientType = getCookie("clientType") || "PC";
  4. if(!Vue.prototype.$permissions(binding.value)){
  5. const tSpan = document.createElement('span');
  6. tSpan.innerHTML = '无访问权限';
  7. el.appendChild(tSpan);
  8. tSpan.style.color = 'rgb(204, 204, 204)';
  9. tSpan.style.fontSize = clientType == "PC" ? "16px" : "12px";
  10. tSpan.style.visibility = 'visible';
  11. el.className += ' no-permissions-single'
  12. const curStyle = window.getComputedStyle(el, '') // 获取当前元素的style
  13. const textSpan = document.createElement('span') // 创建一个容器来记录文字的width
  14. // 设置新容器的字体样式,确保与当前需要隐藏的样式相同
  15. textSpan.style.fontSize = curStyle.fontSize
  16. textSpan.style.fontWeight = curStyle.fontWeight
  17. textSpan.style.fontFamily = curStyle.fontFamily
  18. // 将容器插入body,如果不插入,offsetWidth为0
  19. document.body.appendChild(textSpan)
  20. // 设置新容器的文字
  21. textSpan.innerHTML = el.innerText
  22. // 如果字体元素大于当前元素,则需要隐藏
  23. if (textSpan.offsetWidth > el.offsetWidth) {
  24. // 给当前元素设置超出隐藏
  25. el.style.overflow = 'hidden'
  26. el.style.textOverflow = 'ellipsis'
  27. el.style.whiteSpace = 'nowrap'
  28. // 鼠标移入
  29. tSpan.onmouseenter = function (e) {
  30. // 创建浮层元素并设置样式
  31. const vcTooltipDom = document.createElement('div')
  32. vcTooltipDom.style.cssText = `
  33. overflow: auto;
  34. position:absolute;
  35. top: ${e.clientY}px;
  36. left:${e.clientX-10}px;
  37. padding-left:10px;
  38. background: rgba(0, 0 , 0, .6);
  39. color: #fff;
  40. border-radius:5px;
  41. padding:8px;
  42. display:inline-block;
  43. font-size:12px;
  44. z-index:19999;
  45. pointer-events: none;
  46. `
  47. // 设置id方便寻找
  48. vcTooltipDom.setAttribute('id', 'vc-tooltip')
  49. // 将浮层插入到body中
  50. document.body.appendChild(vcTooltipDom)
  51. // 浮层中的文字
  52. document.getElementById('vc-tooltip').innerHTML = '暂无权限,如申请权限,请提交IT服务热线申请(拨打电话010-59568666或访问itsm@sinochem.com)'
  53. }
  54. // 鼠标移出
  55. tSpan.onmouseleave = function () {
  56. // 找到浮层元素并移出
  57. const vcTooltipDom = document.getElementById('vc-tooltip')
  58. vcTooltipDom && document.body.removeChild(vcTooltipDom)
  59. }
  60. }
  61. // 记得移除刚刚创建的记录文字的容器
  62. document.body.removeChild(textSpan)
  63. }
  64. },
  65. // 指令与元素解绑时
  66. unbind () {
  67. // 找到浮层元素并移除
  68. const vcTooltipDom = document.getElementById('vc-tooltip')
  69. vcTooltipDom && document.body.removeChild(vcTooltipDom)
  70. }
  71. })
  72. // 公共权限的方法
  73. Vue.prototype.$permissions = function(code){
  74. const RIGHTLIST = window.localStorage.getItem('RIGHTLIST');
  75. if(RIGHTLIST != 'undefined' && RIGHTLIST && RIGHTLIST != 'null'){
  76. let permissionsNew = JSON.parse(RIGHTLIST);
  77. let permissions = permissionsNew.map((item,index) =>{
  78. return item.fieldId;
  79. });
  80. return permissions.includes(code)
  81. }else{
  82. return true;
  83. }
  84. };

自定义指令的介绍

钩子函数:

一个指令定义对象可以提供如下几个钩子函数

bind:只调用一次,指令第一次绑定到元素时调用。

inserted:被绑定元素插入父节点时调用。

update:所在组件的VNode更新时调用,但是可能发生在其子VNode更新前。

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue定义指令

    自定义指令 vue里面不仅仅有内置的指令,也可以根据自己的需求构建自定义指令 它其实就是操作DOM元素的属性以及内容 通过directives属性配置自定义指令,有函

    相关 vue 定义指令

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你

    相关 Vue定义指令

     `v-on 、v-model、v-show` 等指令,在操作 dom 时使用了 ref 属性,其实指令也是操作dom 的一种方式,但有时,这些指令并不能满足我们的需求,因此

    相关 vue定义指令

    除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。有的情况下,对普通 DOM 元素进行底层操作,这时候就会用到自定义指令 下面