在在vue中使用防抖函数组件操作中使用防抖函数组件操作
初级初级
1、先写好防抖函数
/**
* @desc 防抖函数
* @param {需要防抖的函数} func
* @param {延迟时间} wait
* @param {是否立即执行} immediate
*/
export function debounce(func, wait, immediate) {
let timeout
return function(...args) {
let context = this
if (timeout) clearTimeout(timeout)
if (immediate) {
let callNow = !timeout
timeout = setTimeout(function() {
timeout = null
}, wait)
if (callNow) func.apply(context, args)
} else {
timeout = setTimeout(function() {
func.apply(context, args)
}, wait)
}
}
}
2、然后在要使用的组件里 import 进来
import { debounce } from 'xxx'
export default {
data: {
return {
vm: this
}
},
methods: {
toDoSth: debounce((vm) => {
// 这里将当前组件实例当参数传入
// 就可以使用实例中定义的一些属性、方法
// 补充一下,这里如果换成非箭头函数的写法,也可以直接访问实例。
},
500,
true
)
}
}
3、在组件方法中使用
template:
<div @click=”toDoSth(vm)”></div>
高级高级
虽然上面的写法已经能解决问题了,但是总觉得不够美观。
在网上搜索一番,看到有个哥们将防抖封装成一个组件,果然和我想的一样。不过这哥们直接将上下文当参数传进来了,比我
把整个实例传进来高明,我在这个基础上添加了 immediate 的功能,还有添加了默认不传 event 参数的情况处理。
debounce.js 文件: