記一次在Vue中使用debounce遇到的坑

Debounce散罕,又稱防抖動(dòng)函數(shù), 常被被用來控制 前端異步請(qǐng)求及其它高耗任務(wù)的頻率傀蓉。

概念比較抽象欧漱,了解一個(gè)業(yè)務(wù)場景,就很容易理解了僚害。

比如通過搜索過濾一個(gè)列表硫椰,通過“@change=“search”監(jiān)聽輸入向后臺(tái)發(fā)起請(qǐng)求,如果每輸入一個(gè)字母就調(diào)用一次”search“向后臺(tái)發(fā)送一次請(qǐng)求萨蚕,效率將會(huì)很低靶草,如果可以將調(diào)用search函數(shù)控制在一定時(shí)間內(nèi),比如1秒內(nèi)岳遥,在這一秒鐘奕翔,我輸入了5個(gè)字母,search函數(shù)被調(diào)用了5次浩蓉,但是只向后臺(tái)發(fā)送一次請(qǐng)求派继,是不是效率就會(huì)提升很多,不需要頻繁調(diào)接口捻艳。

<el-input placeholder="輸入關(guān)鍵字進(jìn)行查詢"
          v-model="searchText"
          @keyup.native="search"></el-input>


methods: {
  search () {
      console.log("此處向后臺(tái)發(fā)起請(qǐng)求")
  }
},

而debounce函數(shù)就是解決這個(gè)問題的驾窟,顧名思義,debounce是“去抖動(dòng)”的意思认轨,結(jié)合以上的業(yè)務(wù)場景就很形象绅络,一段時(shí)間內(nèi)輸入值的變化都是“抖動(dòng)”,不是要真正向后臺(tái)發(fā)請(qǐng)求的真正“動(dòng)作”嘁字,為了讓后臺(tái)不被騷擾恩急,我把這些“抖動(dòng)”的小動(dòng)作都屏蔽掉。

然而纪蜒,在學(xué)習(xí)使用debounce函數(shù)的過程中衷恭,我踩了好幾個(gè)坑,分享出來以供借鑒纯续。

我使用的是lodash自帶的debounce函數(shù)随珠,官方文檔這樣描述的

_.debounce(func, [wait=0], [options={}])

兩個(gè)必選參數(shù)中灭袁,第一個(gè)是防抖動(dòng)的函數(shù),第二個(gè)是防抖動(dòng)的時(shí)間毫秒數(shù)窗看。很像“setTimeout”函數(shù)的寫法简卧。

于是我將代碼寫成:

// 錯(cuò)誤示例
methods: {
  search () {
    this._.debounce(() => {
      console.log('此處向后臺(tái)發(fā)起請(qǐng)求:' + this.searchText)
    }, 1000)
  }
}

控制臺(tái)既沒有報(bào)錯(cuò),也沒有打印出任何東西烤芦,后來經(jīng)同事提醒举娩,發(fā)現(xiàn)debounce函數(shù)的返回值是一個(gè)function,跟setTimeout使用是不一樣的

Returns
(Function): Returns the new debounced function.

于是构罗,我將代碼改為铜涉,在debounce后面加了個(gè)(),讓這個(gè)返回的函數(shù)立即執(zhí)行

// 錯(cuò)誤示例
methods: {
  search () {
    this._.debounce(() => {
      console.log('此處向后臺(tái)發(fā)起請(qǐng)求:' + this.searchText)
    }, 1000)()
  }
},

這次遂唧,控制臺(tái)終于打出了我想要的結(jié)果芙代,但是。盖彭。纹烹。但是,并沒有起到防抖動(dòng)的作用召边,我在一秒鐘按幾次鍵盤铺呵,就打印出多少條數(shù)據(jù),只是會(huì)有1秒的延遲隧熙,更想象中的效果不一樣片挂。

后臺(tái)看了Vue的官方實(shí)例,修改代碼為贞盯,得到了我想要的效果音念,即以一秒鐘為單位,控制臺(tái)輸入input里的值躏敢,多余的被判定為“抖動(dòng)”的輸入闷愤,不會(huì)在控制臺(tái)打印。

// 正確示例

//  加載到vue原型鏈上的lodash在method函數(shù)后的定義的地方取不到件余,重新引了一遍
import _ from 'lodash'
export default {
    methods: {  
      // 加載到原型鏈上的lodash讥脐,在getRemote后取不到
       // 注意,這里debounce中的第一個(gè)參數(shù)蛾扇,不能寫成箭頭函數(shù)攘烛,否則魏滚,取不到this
      getRemote: _.debounce(function () {
        console.log('此處向后臺(tái)發(fā)起請(qǐng)求:', this.searchText)
      }, 1000),
      search () {
        this.getRemote()
      }
    }
}

得到想要的結(jié)果镀首,但是還是留了三個(gè)疑問:
1.為什么在main.js中引入Vue原型鏈上的lodash在getRemote后不能用?
2.為什么getRemote的debounce第一個(gè)參數(shù)寫成箭頭函數(shù)就取不到this鼠次?
3.最后一個(gè)正確示例和倒數(shù)第一個(gè)錯(cuò)誤示例的寫法更哄,原理上的區(qū)別是什么芋齿?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市成翩,隨后出現(xiàn)的幾起案子觅捆,更是在濱河造成了極大的恐慌,老刑警劉巖麻敌,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栅炒,死亡現(xiàn)場離奇詭異,居然都是意外死亡术羔,警方通過查閱死者的電腦和手機(jī)赢赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來级历,“玉大人释移,你說我怎么就攤上這事×戎常” “怎么了玩讳?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嚼贡。 經(jīng)常有香客問我熏纯,道長,這世上最難降的妖魔是什么粤策? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任豆巨,我火速辦了婚禮,結(jié)果婚禮上掐场,老公的妹妹穿的比我還像新娘往扔。我一直安慰自己,他們只是感情好熊户,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布萍膛。 她就那樣靜靜地躺著,像睡著了一般嚷堡。 火紅的嫁衣襯著肌膚如雪蝗罗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天蝌戒,我揣著相機(jī)與錄音串塑,去河邊找鬼。 笑死北苟,一個(gè)胖子當(dāng)著我的面吹牛桩匪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播友鼻,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼傻昙,長吁一口氣:“原來是場噩夢啊……” “哼闺骚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妆档,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤僻爽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贾惦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胸梆,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年须板,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乳绕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逼纸,死狀恐怖洋措,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杰刽,我是刑警寧澤菠发,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站贺嫂,受9級(jí)特大地震影響滓鸠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜第喳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一糜俗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曲饱,春花似錦悠抹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驻谆,卻和暖如春卵凑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胜臊。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工勺卢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人象对。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓黑忱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杨何,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 國畫用墨之妙以及墨法避忌 中國畫的用墨之妙,在于濃淡相生沥邻,全濃全淡都沒有精神危虱,必須有濃有淡,濃處須精彩而不滯唐全,淡處...
    崔金娥閱讀 1,508評(píng)論 0 0
  • 三極管和場效應(yīng)管的區(qū)別 1埃跷、場效應(yīng)管是電壓控制元件,而三極管是電流控制元件邮利。在只允許從信號(hào)源取較少電流的情況下弥雹,應(yīng)...
    剩下的盛夏0320閱讀 410評(píng)論 0 0
  • 1.導(dǎo)言2.R基本原理及概念 導(dǎo)言 R簡介R是有統(tǒng)計(jì)分析功能及強(qiáng)大作圖功能 的軟件系統(tǒng),也可以稱為一種語言延届。包含了...
    Bio小盼閱讀 329評(píng)論 0 0
  • 一剪勿、課題介紹: 張氏零力度正骨術(shù)是根據(jù)傳統(tǒng)醫(yī)學(xué)中醫(yī)正骨的精髓結(jié)合《物理學(xué)》,《幾何學(xué)》方庭,《人體骨骼解剖學(xué)》厕吉,《生物...
    愛醫(yī)講壇閱讀 499評(píng)論 0 0
  • 20170322,365 主題:修筑一座健康的長城② 修筑一座健康長城② 刻意練習(xí) 廢人 這幾天械念,我們涉足了不同領(lǐng)...
    卡蜜爾閱讀 1,269評(píng)論 0 1