Vue使用debounce防抖函数遇到的坑和解决方案

1,809 阅读1分钟

因为input输入时需要请求后台,结果每次输入一个字符都会请求,连续输就连续请求。 

 结果被领导发现,不能忍受,所以要求加一个防抖。

加就加呗,反正lodash.js有现成的debounce方法,于是,说干就干! 

// html代码如下: 
<el-input v-model="chartName" size="mini" @input="handleDebounce"></el-input> 

// js 代码如下 
import { debounce } from 'lodash'; 
methods: { 
    handleDebounce() { 
        debounce(this.handleAjax(), 500); 
    } 
} 

哈哈,真简单,准备自测一下,就提测吧! 

 当当当当...... 结果,不仅没有防抖成功,还报错了~ 

 搞不懂,是我使用的方式不对吗? 

 于是,又尝试了几种写法: 

// 写法一 
methods: { 
  handleDebounce() {
        debounce(this.handleAjax, 500); 
  } 
} // 连请求都不对会发  // 写法二 
methods: { 
    handleDebounce() { 
        return debounce(this.handleAjax(), 500); 
    } 
} 
// 还是不防抖,而且报错

一万只羊陀在我脑海里奔腾而过...... 

网上搜了各种文章,他们也都是这样写的呀~ 代码也欺负人吗? 

好吧,抱怨是解决不了问题的,只好继续找......找呀找呀找朋友。 

终于被我找到一个好朋友: 

created() { 
    // 防抖函数,必须要这样定义才有效 
    this.handleDebounce = debounce(this.handleAjax, 500); 
} 

是的,你没有看到,这个方法要在ceated钩子函数里定义。(意不意外?) 

 然后,就真的成功防抖了(惊不惊喜?) 

 哦,对了,还可以不使用@input事件,而改用监听的方式: 

 // html代码: 
<el-input v-model="youName" size="mini"></el-input> 
// js代码: 
watch: { 
    youName() { 
        this.handleDebounce() 
    } 
}, 
created() { 
    // 防抖函数,必须要这样定义才有效 
    this.handleDebounce = debounce(this.handleAjax, 500); 
}

 为什么?防抖函数要这样做才生效呢?

 好吧,我不知道,有知道的老铁,还希望在评论区告诉我呀,爱你哦!