自定义指令+后端 实现动态全局按钮权限控制(v-has)

一、自定义指令 v-has (btnControl.js):

export default (Vue) => {
  /** 权限指令,对按钮权限的控制 **/
  Vue.directive('has', {
      inserted: function (el, binding) {
        // 获取按钮权限
        if (!Vue.prototype.$_has(binding.value)) {
         //移除不匹配的按钮
          el.parentNode.removeChild(el);
        }
      },
    Vue.prototype.$_has = function (value) {
      let isExist = false
      // 从浏览器缓存中获取权限数组
      var buttonpermsStr = sessionStorage.getItem('btnContext');
      if (buttonpermsStr === undefined || buttonpermsStr == null) {
        return false
      } else {
        JSON.parse(buttonpermsStr).forEach(element => {
            //匹配缓存中的数据中有没有匹配的值
          if (element.code == value) {
            // 若在按钮中定义的权限字段能在后端返回的权限数组中能找到,则该按钮可显示
            isExist = true
          }
        });
      }
      return isExist
    }
    }

二、在全局引用(main.js)

import btnControl from './common/js/btnControl';
Vue.use(btnControl);

三、监听点击的$route(Home.vue)

 watch: {
      $route: {
        immediate: true,//开启首次监听
        handler: function (val) {
        //调用后端方法
          util.getBtnList(val);
        },
        //深度监听
        deep: true,
      }
    },

四、后端数据读取(util.js)

// 后端获取按钮权限
  getBtnList(val) {
    if(val != undefined){
    let _this = this;
    let data = {
      menuId: val.meta.id
    };
    $.ajax({
      type: "post",
      url:baseURL + "/sys/menu/***",
      dataType: "json",
      data: JSON.stringify(data),
      traditional: true,
      contentType: "application/json;charset=utf-8",
      success: function (res) {
          //在sessionStorage中添加按钮数据
        sessionStorage.setItem("btnContext",JSON.stringify(res.data));
      }
    });
    }
  },

五、在模板中使用v-has指令(template中)

  • 使用方式:v-has=" ‘后端定义的值’ "
  • 注意:直接在双引号写会识别成变量,再加上单引号才会变成字符串
 <el-button type="" size="mini" v-has="'btn_form_add'" :disabled="saveMenuAble" @click="saveMenu">新增保存</el-button>
 <el-button type="" size="mini" v-has="'btn_form_edit'" :disabled="updateMenuAble" @click="updateMenu">修改保存</el-button>

在这里插入图片描述

六、问题

  • 在自定义指令中使用 bind 下 el.parentNode.removeChild(el) 失效?
    解决方式:使用 inserted 。
钩子函数

一个指令定义对象可以提供如下几个钩子函数 (均为可选):
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 inserted:被绑定元素插入父节点时调用
(仅保证父节点存在,但不一定已被插入文档中)。 update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode
更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。
我们会在稍后讨论渲染函数时介绍更多 VNodes 的细节。 componentUpdated:指令所在组件的 VNode 及其子 VNode
全部更新后调用。 unbind:只调用一次,指令与元素解绑时调用。


前端小白的第一次写文章,记录一下完成的第一个组件。

  • 14
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,关于你的问题,我来尝试回答一下。 在uni-app中,我们可以通过自定义指令实现全局图片dpr适配。具体步骤如下: 1. 在项目的根目录下,创建一个`/common/directives`目录。 2. 在该目录下,新建一个`index.js`文件,用于存放自定义指令。 3. 在`index.js`文件中,定义一个`img`指令,用于处理所有`<img>`标签。 4. 在`img`指令中,通过`uni.getSystemInfoSync()`方法获取设备的dpr值。 5. 根据dpr值,设置`<img>`标签的`src`属性,以实现图片dpr适配。 下面是示例代码: ```javascript // /common/directives/index.js export default { img: { // 指令定义函数 bind: function(el, binding) { // 获取设备的dpr值 const dpr = uni.getSystemInfoSync().pixelRatio; // 根据dpr值,设置图片的src属性 const imgPath = binding.value; el.setAttribute('src', imgPath + '@' + dpr + 'x'); } } } ``` 使用自定义指令时,需要在`main.js`文件中全局注册自定义指令: ```javascript // /main.js import directives from './common/directives'; // 注册自定义指令 Object.keys(directives).forEach(key => { Vue.directive(key, directives[key]); }); ``` 完成上述步骤后,即可在项目中使用`v-img`指令实现全局图片dpr适配: ```html <template> <img v-img="'/static/img/test.png'" /> </template> ``` 这样,`<img>`标签的`src`属性就会根据设备的dpr值自动添加相应的后缀,以达到图片dpr适配的效果。 希望我的回答能够帮到你,如有疑问请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值