vue2 通过Vue.directive自定义指令实现权限判断、防抖节流

/**
 * 权限指令 
 * 例:<div v-permission="'table/del'"></div>
 */
app.directive('permission', {
   inserted: function (el, binding) {
     const { value } = binding

     // 获取VueX中的 权限按钮列表
     const buttonList = store.state.user.permission

     if (value) {
       // some 遇到 return true 时 会结束遍历
       const hasPermission = buttonList.some(btnKey => btnKey === value)
       // 没有权限直接移除 dom元素
       if (!hasPermission) {
         el.parentNode && el.parentNode.removeChild(el)
       }
     } else {
       throw new Error(`需要指定权限标识! 如:v-permission="'table_del'"`)
     }
   }
 })

/**
* 防抖指令 单位时间只触发最后一次
* @param {Function} fn - 执行事件
* @param {?String|“click”} event - 事件类型 例:“click”
* @param {?Number|500} time - 间隔时间
* @param {Array} binding.value - [fn,event,time]
* 直接使用: 刷新
* 配置事件,间隔时间: 刷新
* 事件传递参数则: 刷新
*/

 app.directive('debounce', {
   inserted: function (el, binding) {
     try {
       let fn, event = "click", time = 500;
       if (typeof binding.value == 'function') {
         fn = binding.value
       } else {
         [fn, event, time] = binding.value
       }

       let timer;
       el.addEventListener(event, () => {
         timer && clearTimeout(timer)
         timer = setTimeout(() => fn(), time)
       })
     } catch (error) {
       console.log("防抖指令---error==>", error)
     }
   }
 })

/**
* 节流指令 一段时间内首次触发时立即执行,此时间段内再次触发,不会执行!
* @param {Function} fn - 执行事件
* @param {?String|“click”} event - 事件类型 例:“click”
* @param {?Number|500} time - 间隔时间
* @param {Array} binding.value - [fn,event,time]
* 直接使用: 刷新
* 配置事件,间隔时间: 刷新
* 事件传递参数则: 刷新
*/

    app.directive('throttle', {
      inserted: function (el, binding) {
        try {
          let fn, event = "click", time = 1500;
          if (typeof binding.value == 'function') {
            fn = binding.value
          } else {
            [fn, event, time] = binding.value
          }
          /**
           * el.preTime 记录上次触发的时间
           * 每次触发比较nowTime(当前时间) 和 el.preTime 的差是否大于指定的时间段!
           */
          el.addEventListener(event, () => {
            const nowTime = new Date().getTime()
            if (!el.preTime || nowTime - el.preTime > time) {
              console.log(!el.preTime, nowTime - el.preTime, nowTime - el.preTime > time)
              el.preTime = nowTime
              fn()
            }
          })
        } catch (error) {
          console.log("节流指令---error==>", error)
        }
      }
    })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值