vue自定义指令:防抖与节省

访客4年前黑客文章646

防抖

注释:触发事宜后,一段时间内没有再次触发则执行,若此时间段内再次触发重新延时!

v-antiShake

// 实现

Vue.directive('antiShake', {
  // 被绑定米素插入父节点时挪用 (仅保证父节点存在,但不一定已 *** 入文档中)。
  /**
  * el 指令所绑定的米素,可以用来直接操作 DOM 。
  * binding 一个工具,包罗绑定的值
  */
  
  inserted: function(el, binding) {
    const { callback, time } = binding.value
    el.callback = callback
    el.time = time
    el.timeCall = null
    el.addEventListener('click', () => {
      clearTimeout(el.timeCall)
      el.timeCall = setTimeout(() => {
        el.callback()
      }, el.time || 500)
    })
  },
  // 所在组件的 VNode 更新时挪用
  update: function(el, binding) {
    console.log('update')
    const { callback, time } = binding.value
    el.callback = callback
    el.time = time
  },
})

焦点原理

     const { callback, time } = binding.value
    el.callback = callback
    el.time = time
    el.timeCall = null
    el.addEventListener('click', () => {
      clearTimeout(el.timeCall)
      el.timeCall = setTimeout(() => {
        el.callback()
      }, el.time || 500)
    })

通过定时器setTimeout延时执行click回调,当el.time || 500 时间内,再次触发时 clearTimeout(el.timeCall)关闭定时器,再次重新延时

el.callback = callback 和 el.time = time 挂在el上是为了,当v-antiShake绑定的值更新后,事宜触发更新后的callback

 update: function(el, binding) {
    console.log('update')
    const { callback, time } = binding.value
    el.callback = callback
    el.time = time
  },
使用

指令的值testClick未做深watch,只有工具整体改变才会触发指令中update钩子函数

 <button v-antiShake="testClick">click</button>
 
 // testClick
  testClick: {
     time: 1000,
     callback: () => {
        console.log(1111)
        console.log(this.test)
      }
  }


节省

一段时间内首次触发时立刻执行,此时间段内再次触发,不会执行!

实现:

Vue.directive('throttling', {
  // 被绑定米素插入父节点时挪用 (仅保证父节点存在,但不一定已 *** 入文档中)。
  inserted: function(el, binding) {
    const { callback, time } = binding.value
    el.callback = callback
    el.time = time
    el.addEventListener('click', () => {
      const nowTime = new Date().getTime()
      if (!el.preTime || nowTime - el.preTime > el.time) {
        el.preTime = nowTime
        el.callback()
      }
    })
  },
  update: function(el, binding) {
    console.log('update')
    const { callback, time } = binding.value
    el.callback = callback
    el.time = time
  }
})

el.preTime 纪录上次触发事宜,每次触发对照nowTime(当前时间) 和 el.preTime 的差是否大于指定的时间段!


思源资源网:分类流动

1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入

相关文章

黑客在线QQ接单免费(24小时黑客在线接单qq)

一、黑客在线QQ接单免费(24小时黑客在线接单qq) 1、大家不要相信这个人【至尊黑客程序】在线接单 他骗了好多。嗯,对,我也被他骗了50元! 2、黑客免费送QQ真的假的?当然是假的了 就骗傻子呢...

为什么叫土豪?土豪其实是贬义,你误会了

为什么叫土豪?土豪其实是贬义,你误会了

自从这两天被支付宝打击以后,我就想找个土豪交朋友。 可是爱钻研的我,突然想知道“土豪”一词,它原来到底是指什么人呢?而我们最早听说的关于土豪的词组“土豪劣绅”又是啥意思呢? 经查,“土豪”一词指这...

黑客的学历,黑客网络侦听,看别人qq聊天记录

拿到的第一个样本名称是svvhost.exe(也便是MS17-010缝隙扫描的样本),样本巨细4M多,所以看一下资源。 applepie commit `f84c084feb487e2e7f31f9...

魔兽世界好玩吗(魔兽世界为何好玩?)

  魔兽世界好玩吗(魔兽世界为何好玩?)大家好,欢迎来到七爷魔兽系列。好久不见,今天和大家聊聊游戏里的大秘境。   大秘境这个概念是从暗黑3来的,玩法么大家都很熟悉了:原来的副本加难度,每升1层怪的血...

希腊将封锁全国国家安全部邱进以防控新冠疫情

  希腊将封锁全国以防控新冠疫情   新华社雅典11月5日电(记者于帅帅 李晓鹏)希腊总理米佐塔基斯5日发表电视讲话,宣布自7日早晨起全国进入为期三周的封锁状态,以防控近期急速蔓延的新冠疫情,避免出...

找黑客改四级(找黑客)

我去年找了一个393275088,现在还在应该比较有实力!。 只要备份库没改,肯定都会恢复的,改数据必须主库和备份库一起修改才行 这是可以的亲,一般大学校园教务系统的防御会很弱,被攻击是常有的事情。删...