当前位置:首页 > React

React如何使用防抖

2026-03-31 17:59:12React

React 中使用防抖的方法

防抖(Debounce)是一种优化高频触发事件的技术,确保函数在最后一次调用后的一段时间内不再被触发。在 React 中,可以通过以下几种方式实现防抖。

使用 Lodash 的 debounce 函数

Lodash 提供了 debounce 函数,可以直接用于 React 组件。以下是一个示例:

import React, { useState } from 'react';
import { debounce } from 'lodash';

function SearchComponent() {
  const [query, setQuery] = useState('');

  const handleSearch = debounce((value) => {
    console.log('Searching for:', value);
    // 执行搜索逻辑
  }, 500);

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

  return (
    <input
      type="text"
      value={query}
      onChange={handleChange}
      placeholder="Search..."
    />
  );
}

export default SearchComponent;

自定义防抖 Hook

可以创建一个自定义 Hook 来实现防抖功能:

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

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

  useEffect(() => {
    timeoutRef.current = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

    return () => {
      clearTimeout(timeoutRef.current);
    };
  }, [value, delay]);

  return debouncedValue;
}

function SearchComponent() {
  const [query, setQuery] = useState('');
  const debouncedQuery = useDebounce(query, 500);

  useEffect(() => {
    if (debouncedQuery) {
      console.log('Searching for:', debouncedQuery);
      // 执行搜索逻辑
    }
  }, [debouncedQuery]);

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

  return (
    <input
      type="text"
      value={query}
      onChange={handleChange}
      placeholder="Search..."
    />
  );
}

export default SearchComponent;

使用 useCallbacksetTimeout

通过 useCallbacksetTimeout 结合实现防抖:

React如何使用防抖

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

function SearchComponent() {
  const [query, setQuery] = useState('');
  const timeoutRef = React.useRef();

  const handleSearch = useCallback((value) => {
    clearTimeout(timeoutRef.current);
    timeoutRef.current = setTimeout(() => {
      console.log('Searching for:', value);
      // 执行搜索逻辑
    }, 500);
  }, []);

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

  return (
    <input
      type="text"
      value={query}
      onChange={handleChange}
      placeholder="Search..."
    />
  );
}

export default SearchComponent;

注意事项

  • 防抖的时间间隔(如 500ms)可以根据实际需求调整。
  • 使用 Lodash 的 debounce 时,注意在组件卸载时取消防抖函数,避免内存泄漏。
  • 自定义 Hook 或 useCallback 方法更适合在需要频繁更新状态的场景中使用。

以上方法均能有效实现防抖功能,具体选择取决于项目需求和个人偏好。

分享给朋友:

相关文章

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

react如何使用ueditor

react如何使用ueditor

安装 UEditor 下载 UEditor 的官方版本,解压后将整个文件夹放入项目的 public 目录下。确保可以通过 URL 直接访问 UEditor 的资源文件,例如 public/uedito…

vue的防抖实现

vue的防抖实现

Vue 防抖实现方法 在Vue中实现防抖(debounce)可以通过以下几种方式完成: 使用Lodash库的debounce方法 安装Lodash: npm install lodash 在组件中…

vue如何实现防抖

vue如何实现防抖

Vue 防抖的实现方法 在Vue中实现防抖(debounce)可以通过以下几种方式,根据不同的使用场景选择合适的方法。 使用 Lodash 的 debounce 函数 Lodash 是一个流行的 J…

react激光如何使用

react激光如何使用

安装React激光库 在项目中安装React激光库,通常通过npm或yarn完成。确保项目已初始化并具备React环境。 npm install react-laser-beam # 或 yar…

react如何使用echarts

react如何使用echarts

安装 ECharts 和 React 适配库 在 React 项目中使用 ECharts 需要安装 ECharts 核心库及其 React 适配库。通过 npm 或 yarn 安装: npm ins…