如何在 React 中实现防抖(debounce)的搜索输入框?

如何在 React 中实现防抖(debounce)的搜索输入框?

回答与解析:

在 React 中实现防抖搜索输入框,通常是为了避免用户每次输入都立即触发搜索请求(如调用 API),从而减少不必要的网络请求和提升性能。可以通过自定义 Hook 或直接使用 lodash 的 debounce 工具函数来实现。

方法一:使用自定义 Hook 实现 debounce

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

function useDebounce(value, delay) {
  const [debouncedValue, setDebouncedValue] = useState(value);

  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

    return () => {
      clearTimeout(handler);
    };
  }, [value, delay]);

  return debouncedValue;
}

function SearchInput() {
  const [inputValue, setInputValue] = useState('');
  const debouncedSearchTerm = useDebounce(inputValue, 500);

  useEffect(() => {
    if (debouncedSearchTerm) {
      // 在此处执行搜索逻辑,例如调用 API
      console.log('Searching for:', debouncedSearchTerm);
    }
  }, [debouncedSearchTerm]);

  return (
    <input
      type="text"
      value={inputValue}
      onChange={(e) => setInputValue(e.target.value)}
      placeholder="搜索..."
    />
  );
}

方法二:使用 lodash.debounce

npm install lodash.debounce
import { useState, useCallback } from 'react';
import debounce from 'lodash.debounce';

function SearchInput() {
  const [inputValue, setInputValue] = useState('');

  const handleSearch = useCallback(
    debounce((value) => {
      console.log('Searching for:', value);
    }, 500),
    []
  );

  const handleChange = (e) => {
    const value = e.target.value;
    setInputValue(value);
    handleSearch(value);
  };

  return (
    <input
      type="text"
      value={inputValue}
      onChange={handleChange}
      placeholder="搜索..."
    />
  );
}

解析要点:

  • 防抖的核心思想是“延迟执行”,只有在用户停止输入一段时间后才真正触发搜索。
  • 自定义 Hook 方式更可控,不依赖第三方库,适合对性能和包体积敏感的项目。
  • 使用 lodash 的 debounce 更简洁,但需注意在组件卸载时取消 pending 的调用(useCallback + 依赖数组为空可避免重复创建 debounce 函数)。
  • 切勿在 render 中直接创建 debounce 函数(会导致每次渲染都生成新函数),应使用 useCallback 或在组件外定义。

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: