防抖(Debounce)和节流(Throttle)都是用来控制某个函数在一定时间内触发次数,两者都是为了减少触发频率,以便提高性能或者说避免资源浪费。
防抖:指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
<input @keyup="sends(list)" />
data() {
return {
timeout: null
}
},
methods: {
debounce(fn, item) {
if (this.timeout !== null) {
clearTimeout(this.timeout)
}
this.timeout = setTimeout(() => {
fn()
}, item)
},
sends() {
this.debounce(() => {
console.log('防抖被调用了')
}, 3000)
}
}
节流:指连续触发事件但是在 n 秒中只执行一次函数。
方法一
<input @keyup="sends(list)" />
data() {
return {
canUse: true
}
},
methods: {
throttle(fn, item) {
if (this.canUse) {
fn()
this.canUse = false
setTimeout(() => {this.canUse = true}, item)
}
},
sends() {
this.throttle(() => {
console.log(this)
}, 3000)
}
}
方法二
<el-button :loading="handLoading" type="primary" @click="handleConfirm" >确定</el-button>
data() {
return {
handLoading: false
}
},
methods: {
handleConfirm() {
this.handLoading = true
console.log('节流')
setTimeout(() => {
this.handLoading = false
}, 300)
}
}