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

访客4年前黑客文章640

防抖

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

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、黑客上哪找有什么问题你直言。并不是所有问题黑客都能黑客并非神。 在吗?黑客大户的联系方式黑客大户的联系方式,你可以在一些平台上面,他们都在那里先选好自己。 有没有人知道...

中医告诉你拔罐的好处和坏处,找准穴位拔火罐

中医告诉你拔罐的好处和坏处,找准穴位拔火罐

朋友最近感觉自己身体有很多毒素,经络也不太通,朋友推荐她去拔罐,还说拔罐后特别舒服,甚至有一段时间不拔你就会感觉难受。可母亲大人却告诉她年轻人不能轻易拔罐,会损伤元气。到底该听谁的?对此朋友很是纠结。...

意大利新冠确诊病例逾太子横120万 部分地区重症病床紧

  中新网11月17日电 据欧联网援引欧联通讯社报道,当地时间16日,意大利紧急民防部报告新增确诊病例27354例,死亡病例546例。随着疫情持续蔓延,意大利医疗资源出现短缺问题,防疫当局正就此积极进...

怎么迁移微信聊天记录到另一台手机(详细教程教你快速转移技巧.

 我们不妨先谈谈丢失备份磁带的问题:如果丢失的或被盗窃的磁带没有加密,那么如果一个坏家伙得到了这种磁带,你就等着瞧吧。这根本就不需要攻击。   Forrester Group 的首席分析师Noel Y...

宝宝晚上喜欢玩不睡的心情感慨 小孩不睡觉发朋友圈的句子

静静的体会宝宝胎动产生的满足感,这一定是个调皮的小宝宝大白天睡多了 夜里玩到现在都不睡,如果你高兴,母亲陪在你身边,不管多晚。可是孩子出生之后不但要喂母乳并且宝妈妈们也有事儿做,大白天彻底沒有精神实...

网站有哪些html代码需要优化

网站有哪些html代码需要优化

普通人看到的界面是由html代码组织出来的,对网站html代码就行优化的目标是让网站对搜索引擎更为友好。一个前端精细的网站对用户友好,一个各方面优化到位的网站对搜索引擎友好,就是抱负的网站。 html...