注释:触发事宜后,一段时间内没有再次触发则执行,若此时间段内再次触发重新延时!
// 实现
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米代金券、领会最新阿里云产物的种种优惠流动点击进入
2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各种产物的最新流动,优惠券领取点击进入
3.广告同盟: 整理了现在主流的广告同盟平台,若是你有流量,可以作为参考选择适合你的平台点击进入
链接: http://www.fly63.com/article/detial/6034