React 實現input輸入框的防抖和節流


1.為什么使用防抖和節流
對於頻繁觸發的事件 比如keydown keyup事件 當頻繁點擊時候 會多次觸發事件 頁面出現卡頓 影響性能

2.函數防抖(debounce):間隔時間內只執行一次   函數節流(throttle):間隔時間內執行

3.使用場景
函數防抖:搜索框等 
函數節流:鼠標不斷點擊事件等

4.目的

提升性能 提高用戶體驗

5.用react實現防抖和節流

import React, { Component } from "react";
class UnDebounce extends Component {
  constructor(props) {
    super(props);
    this.state = {
      timerId: null, //整數 定時器的編號 用來取消這個定時器
    }
  }

  //模仿ajax請求
  ajax = (content) => {
    console.log('ajax:' + content)
  }

  debounce = (fn, delay = 3000) => {
    //期間間隔執行 節流
    return (...rest) => { //箭頭函數是沒有arguments的 所以用...rest 來代替
      let args = rest;
      if (this.state.timerId) clearTimeout(this.state.timerId);//要用this.timerId 而不能直接定義var timerId=null;
      this.state.timerId = setTimeout(() => {
        fn.apply(this, args)
      }, delay)
    }

  }

  throttle = (fn, delay = 3000) => {//
    //期間間隔執行 節流
    let canRun = true;
    return (...rest) => {
      if (!canRun) return;
      canRun = false;
      setTimeout(() => {
        fn.apply(this, rest);
        canRun = true;
      }, delay)

    }
  }

  onUndebounceKeyUpClick = (e) => {//只要是按下鍵盤就會發生ajax請求 會出現資源浪費 一般情況下當輸入完整字符才會請求數據
    this.ajax(e.target.value)
  }


  onDebounceKeyUpClick = (e) => {//加入防抖動后 在頻繁輸入后 不會發送請求
    let debounceAjax = this.debounce(this.ajax, 3000)
    debounceAjax(e.target.value)
  }

  onThrottleKeyUpClick = (e) => { //ajax會按照我們設定的時間,每1s執行一次
    let throttleAjax = this.throttle(this.ajax, 3000);
    throttleAjax(e.target.value)
  }
  render() {
    return (
      <div>
        正常input:<input onKeyUp={this.onUndebounceKeyUpClick} />
        防抖動的input:<input onKeyUp={this.onDebounceKeyUpClick} />
        節流的input:<input onKeyUp={this.onThrottleKeyUpClick} />
      </div>
    );
  }
}

export default UnDebounce;

         

6.使用lodash實現防抖和節流
import _ from 'lodash';
實現防抖 :onClick = { _.debounce(this.ajax, 200)}
實現節流 :onClick = { _.throttle(this.ajax, 200)}        


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM