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

访客3年前黑客文章620

防抖

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

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米代金券、领会最新阿里云产物的种种优惠流动点击进入

相关文章

加盟烤肉店要多少钱,纸上烤肉食材菜单图

  你们二十个人最起码要四个炉子吧!一个炉子加小用具和炭火,四十块钱一份,四个就是一百六,帐篷价格不是很清楚了   像这样的话开一家烧烤店要多少钱?要多少人有什么好的烧烤联盟可以加盟,。   1:装修...

怎么弄到别人的微信密码?咋样解开他人微信密码

怎么做到他人的微信密码?怎么样解除别人微信密码...

鱼缸造景(送你点鱼缸造景素材)

鱼缸造景(送你点鱼缸造景素材) 鱼缸太单调,水草缸又太复杂了,怎么办?我忽然想起鱼友时不时也总问我这个问题,鱼缸要放点什么东西好,裸缸看上去太单调了。确实,现在大家对鱼审美的要求越来越高了,裸缸虽然...

育碧免费畅玩三天《刺客信条:奥德赛》

3月19日至3月22日,您将可以免费畅玩《刺客信条:奥德赛》。做好准备,现在就去预载游戏! 迫不及待成为一名斯巴达战士? 观赏预告片 从被抛弃到成为活着的传说,踏上一段艰苦...

查询爱人手机短信

. 看望朋友或者亲戚的女宝宝应该送什么礼物,女宝宝家庭给什么好,什么样的礼物适合送给女宝宝的家庭呢,相信很多人对看有女宝宝的亲戚或者朋友或者同事不知道送什么好,友谊长存小编为大家带来了相关的推荐。...

京剧中的金脸和银脸代表什么人物(京剧中金脸银脸代表什么人物)

戏曲是在我国的瑰宝,是在我国引入和散播我国民族文化及文化的关键媒体。下列是戏曲的介绍,供大伙儿参照和相互学习。 戏曲的产生 戏曲曾被称作平剧,徽剧是戏曲的原名。另外,它接纳了昆剧和秦腔戏曲的一些曲...