当前位置:首页 > React

React如何使用防抖

2026-03-31 17:59:12React

React 中使用防抖的方法

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

React如何使用防抖

使用 Lodash 的 debounce 函数

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

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 结合实现防抖:

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 方法更适合在需要频繁更新状态的场景中使用。

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

分享给朋友:

相关文章

react refs如何使用

react refs如何使用

React Refs 的基本概念 Refs 提供了一种直接访问 DOM 节点或 React 组件实例的方式。通常在需要直接操作 DOM 或访问组件方法时使用。 创建 Refs 使用 React.cr…

react dnd如何使用

react dnd如何使用

React DnD 使用指南 React DnD(Drag and Drop)是一个用于在 React 应用中实现拖放功能的库。它基于 HTML5 的拖放 API,提供了更高级的抽象和更好的 Reac…

react如何使用sass

react如何使用sass

安装 Sass 依赖 在 React 项目中安装 sass 作为开发依赖: npm install sass --save-dev 或使用 Yarn: yarn add sass --dev 创建…

如何使用react native

如何使用react native

安装开发环境 确保系统已安装Node.js(建议LTS版本)。通过npm或yarn全局安装React Native命令行工具: npm install -g react-native-cli # 或…

内网如何使用react框架

内网如何使用react框架

内网使用React框架的部署与开发方法 在无外网连接的内网环境中使用React框架,需提前准备依赖包并配置本地开发环境。以下是具体实施方案: 离线安装Node.js和npm 从官网下载Node.js…

react中如何使用swiper

react中如何使用swiper

安装 Swiper 依赖 在 React 项目中使用 Swiper 需要安装 Swiper 的核心库和 React 组件库。通过 npm 或 yarn 安装以下依赖: npm install swi…