vue2 按钮自定义指令

项目开发中,不同的部门、组织、人员,会有不同的功能权限

可以通过给按钮增加v-if 判断按钮是否显示,不过,这种方式需要在每个功能页面写代码逻辑。

我们可以通过给btn添加自定义指令的方式,进行统一处理

使用的时候可以通过下面的方式进行绑定

<el-button
  @click="finishPlan()"
  v-btnlimit="'productionCartonorder_finish'"
>完工</el-button>

那这个指令应该怎么写呢

思路是这样的:
第一步,项目加载时,把权限存起来
第二步,在自定义指令中,对相应的权限按钮进行处理

import Vue from 'vue';
import { sStorage } from '../utils/storage.js';


let type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};


Vue.directive('btnlimit', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: async (el, binding) => {
    // el 当前绑定的元素 binding.value指令的绑定值
    // console.log(Object.prototype.toString.call(binding.value))
    let permissionList = sStorage.get('permission_button') || [];
    if(sessionStorage.pattern === 'parent'){
      permissionList=sStorage.get('moduleAuth');
    }
    //if (sessionStorage.pattern === 'children') {
      // 判断一下是否包含这个元素,如果不包含的话,那就让他爸爸元素把子元素扔进垃圾堆
      if (type(binding.value) === 'string' && !permissionList.includes(binding.value)) {
        el.parentNode.removeChild(el)
      }

      if (type(binding.value) === 'array' && binding.value.length > 0) {
        let minArr = binding.value.length > permissionList.length ? permissionList : binding.value;
        let maxArr = binding.value.length > permissionList.length ? binding.value : permissionList;
        // 求两者交集,无交集证明没有匹配数据
        if (minArr.filter(v => maxArr.find(k => k == v)).length === 0) {
          el.parentNode.removeChild(el)
        }
      }
    //}
    
  }
})

自定义指令的钩子可以用什么呢

inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容