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

访客4年前黑客文章660

防抖

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

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

相关文章

身体护理什么牌子好(值得无限回购的身体护理好物有什么)

身体护理什么牌子好(值得无限回购的身体护理好物有什么)不知道小仙女们是否和编我一样,一到秋季就像是要蜕皮的白素贞一样,身上皮肤各种发痒起皮,可以说十分干躁了。所以,一到换季的时候,我就变身成一只忙碌的...

ddos专业术语英语,游戏发展国黑客怎么找,找黑客查微信聊天删除的记录

DNS从头绑定 3二、Bypass 测验and1=2unionselect1,username,3,4,password,6,7,8,9,10fromadmin这句话爆出账号密码...

不吃晚饭的危害有哪些,真的可以减肥吗!

不吃晚饭的危害有哪些,真的可以减肥吗!

饿着肚子又不吃晚饭,通常只有三种「作死」的人会做:忙死了的加班者、胖死了的瘦身族或者穷死了的学生党。 事实上,不吃晚餐,对身体的危害可大了!小九可以给你随意就列举几个。 不吃晚餐对身体的伤害...

黑客武林,找黑客一般多少钱,可以找黑客改自己的驾照

-s strip comments and whitespaces 3  咱们发现,EK代码中包括有多个行为层,在图片7中显现的运用ActiveXObject进行初始化的状况。...

iPad Pro上市时间曝光:双十一

iPad Pro可能是iPhone2020年最受希望的一款商品了,外国媒体9to5Mac不久曝出了其发售日期,据了解,iPad Pro将在11月11日正式上市。 外国媒体称信息来自密名内部人士,到时...

如何可以监控老公的电话

    今天本文主要给大家分享一则vivo手机微信删除的聊天记...