簡體   English   中英

React 使用 debounce 和 setState

[英]React use debounce with setState

背景

假設我們都知道的debounce從功能lodash

如果用戶快速輸入1121231234 ,它允許我們在一定的延遲時間后僅使用1234進行一次警報。

這非常用於減少請求量,用於優化。


描述

對於普通的輸入字段,我們可以使用那種debounce並且它有效。

問題:一旦我們在同一個回調中使用debounce添加setState ,則debounce將無法正常工作。

有誰知道原因?

import React, { useState } from "react";
import "./styles.css";
import { debounce } from "lodash";

export default function App() {
  const [input, setInput] = useState("");

  const debouceRequest = debounce(value => {
    alert(`request: ${value}`);
  }, 1000);
  const onChange = e => {
    setInput(e.target.value); // Remove this line will lead to normal debounce
    debouceRequest(e.target.value);
  };

  return (
    <div className="App">
      <input onChange={onChange} />
    </div>
  );
}

編輯華麗的場境

試試這個(使用 useCallback):

import React, { useState, useCallback } from "react";
import "./styles.css";
import { debounce } from "lodash";

const request = debounce(value => {
  alert(`request: ${value}`);
}, 1000);

export default function App() {
  const [input, setInput] = useState("");

  const debouceRequest = useCallback(value => request(value), []);

  const onChange = e => {
    debouceRequest(e.target.value);
    setInput(e.target.value); // Remove this line will lead to normal denounce
  };

  return (
    <div className="App">
      <input onChange={onChange} />
    </div>
  );
}

編輯興高采烈的黎明lb5ex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM