vue div点击事件_如何使用vue写节流函数?

什么是节流函数?

        函数节流(throttle),指的是某个函数在一定时间间隔内(例如 3 秒)只执行一次,在这 3 秒内产生函数调用请求直接无视,也不会延长时间间隔。3 秒间隔结束后第一次遇到新的函数调用会触发执行,然后在这新的 3 秒内依旧无视新的函数调用请求,以此类推。

节流函数的使用场景

        频繁的调用dom或者加载资源等行为,比如:点击事件,滚动页面等。这些行为会频繁的触发事件,消耗资源,而节流函数可以阻断这种行为。

如何实现节流函数?

第1步先创建一个vue实例

<div id="app">      <div>内容div>div>        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>    <script>            new Vue({        el:"#app",        methods:{          fn(){            return function(){              console.log(111)            }          }        }      })script>

第2步,使用vue添加一个全局自定义指令

<div id="app">      <div v-throttle:click="[fn(),3000]">内容div>div>        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>    <script>      Vue.directive("throttle",{        bind(el,binding){          console.log(el)          console.log(binding)        }      })            new Vue({        el:"#app",        methods:{          fn(){            return function(){              console.log(111)            }          }        }      })script>

bind是自定义指令的生命周期函数,意思是插入指令的时候触发,里面提供了两个参数,一个是el,一个是binding。el是绑定指令的元素,binding是指令里面的值。

90c01110226254431a491c8e7f3e02ab.png

第3步,写一个节流函数

<div id="app">      <div v-throttle:click="[fn(),3000]">内容div>    div>        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>    <script>      Vue.directive("throttle",{        bind(el,binding){                    let throttle = function(cb,time){//节流函数            let oldTime = 0            return function(){              let nowTime = +new Date()              if(nowTime - oldTime >= time){                oldTime = nowTime                cb.apply(this,arguments)//回调              }            }          }        }      })            new Vue({        el:"#app",        methods:{          fn(){            return function(){              console.log(111)            }          }        }      })script>

思路是每次点击,用现在的时间和上一次点击的时间做比较,如果大于传入的时间,则执行传入的代码,否则不执行。

最后,给元素绑定一个事件监听即可使用

<div id="app">      <div v-throttle:click="[fn(),3000]">内容div>div>        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>    <script>      Vue.directive("throttle",{        bind(el,binding){          let type = binding.arg//事件的类型          let fn = binding.value[0]//要传入的函数          let time = binding.value[1] || 3000//时间,没有就默认3秒触发                    let throttle = function(cb,time){//节流函数            let oldTime = 0            return function(){              let nowTime = +new Date()              if(nowTime - oldTime >= time){                oldTime = nowTime                cb.apply(this,arguments)//回调              }            }          }                    el.addEventListener(type,throttle(fn,time))//事件监听        }      })            new Vue({        el:"#app",        methods:{          fn(){            return function(){              console.log(111)            }          }        }      })script>

好了,这就是这期节流函数的全部内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值