返回

React 使用过程中,如何让输入完成时自动触发请求?

前端

防抖 (Debounce)

防抖是一种技术,它可以用来减少函数的调用次数。它的原理是,当一个函数被调用时,它不会立即执行,而是等待一段时间。如果在这段时间内,函数又被调用了,那么就不会执行之前的调用,而是重新计时。这样,就可以减少函数的调用次数,同时又能保证数据的及时更新。

useEffect 和 useCallback

在 React 中,我们可以使用 useEffectuseCallback 钩子来实现防抖。useEffect 钩子可以用来在组件的某些生命周期中执行一些操作,而 useCallback 钩子可以用来创建不会在每次组件渲染时都改变的回调函数。

实现过程

import { useState, useEffect, useCallback } from "react";

const DebounceInput = () => {
  const [value, setValue] = useState("");

  const debouncedChangeHandler = useCallback(() => {
    // 这里执行向服务器发送请求的操作
  }, []);

  useEffect(() => {
    const timeout = setTimeout(() => {
      debouncedChangeHandler();
    }, 500);

    return () => {
      clearTimeout(timeout);
    };
  }, [value, debouncedChangeHandler]);

  return (
    <input
      type="text"
      value={value}
      onChange={(e) => setValue(e.target.value)}
    />
  );
};

export default DebounceInput;

原理解析

  • 当组件第一次渲染时,useEffect 钩子会创建一个计时器,该计时器将在 500 毫秒后调用 debouncedChangeHandler 函数。
  • 当用户在输入框中输入值时,onChange 事件处理程序会调用 setValue 函数,从而更新 value 状态。
  • 每当 value 状态发生变化时,useEffect 钩子都会重新创建计时器,从而重置计时。
  • 如果用户在 500 毫秒内没有继续输入值,那么计时器就会触发,调用 debouncedChangeHandler 函数,向服务器发送请求。
  • 如果用户在 500 毫秒内继续输入值,那么计时器就会被重置,debouncedChangeHandler 函数就不会被调用。

优点

  • 减少了请求的数量,减轻了服务器和客户端的负担。
  • 保证了数据的及时更新。
  • 使用简单,易于理解。

缺点

  • 可能存在延迟,导致数据更新不及时。
  • 需要额外的代码来实现。