vue——debounce防抖函数无效

发布时间 2023-08-21 16:10:30作者: 前端-xyq
参考:

vue记录-vue中使用lodash _.debounce防抖不生效原因,解决方案

https://blog.csdn.net/Delete_89x/article/details/122000444

 

问题代码:

<el-input
    v-model="slotProps.form.condition"
    placeholder="请输入"
    @input="inputChange"
></el-input>

...

load() {
      // 加载列表
},
// 问题处 inputChange() {
  debounce(this.load())
},

 

封装的debonce函数:

/**
 * 防抖函数 短期内大量触发同一事件,只会执行最后触发的一次
 * @param {Function} fn 需要防抖的函数
 * @param {Number} delay 毫秒,防抖期限值
 */
export const debounce = (fn, delay = 500) => {
  let timer = null;
  return function () {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, delay);
  };
};

 

原因:debounce()返回的是一个函数,一个完成的执行应该是:debounce()(),问题代码直接单纯的调用一次,拿到了返回函数,但是并没有执行

解决方法:执行返回的函数

 

修改后的代码:

/**
 * inputChange拿到debounce()的返回结果 - 函数
 * 这样input事件触发的时候就直接是debounce()()了,所以是可以正常执行的
 */
inputChange: debounce(function () { // 注意,不要在debounce里写箭头函数,否则this的指向就是undefined,而不是Vue实例对象
      this.load();
})