当前位置: 首页 > news >正文

React 中结合 antd 的 Input 组件实现防抖输入

在 React 中结合 antd 的 Input 组件实现防抖输入,可以通过以下几种方式实现:

1. 使用 useEffect 和 setTimeout

代码示例

import React, { useState, useEffect } from "react";
import { Input } from "antd";const DebouncedInput = () => {const [inputValue, setInputValue] = useState(""); // 即时输入值const [debouncedValue, setDebouncedValue] = useState(""); // 防抖后的值useEffect(() => {const timer = setTimeout(() => {setDebouncedValue(inputValue);}, 500); // 防抖延迟时间return () => {clearTimeout(timer); // 清除上一次的计时器};}, [inputValue]);return (<div><Inputplaceholder="输入文字试试"value={inputValue}onChange={(e) => setInputValue(e.target.value)}style={{ width: 300 }}/><p>即时输入值: {inputValue}</p><p>防抖值: {debouncedValue}</p></div>);
};export default DebouncedInput;

2. 使用 Lodash 的 debounce

安装 Lodash

npm install lodash

代码示例

import React, { useState, useCallback } from "react";
import { Input } from "antd";
import _ from "lodash";const DebouncedInput = () => {const [inputValue, setInputValue] = useState("");// 使用 useCallback 包装防抖函数const handleDebouncedChange = useCallback(_.debounce((value) => {console.log("防抖输入值: ", value);}, 500),[]);const handleChange = (e) => {const value = e.target.value;setInputValue(value);handleDebouncedChange(value); // 调用防抖函数};return (<div><Inputplaceholder="输入文字试试"value={inputValue}onChange={handleChange}style={{ width: 300 }}/></div>);
};export default DebouncedInput;

3. 使用自定义 Hook

创建 useDebounce Hook

import { useState, useEffect } from "react";export const useDebounce = (value, delay) => {const [debouncedValue, setDebouncedValue] = useState(value);useEffect(() => {const timer = setTimeout(() => {setDebouncedValue(value);}, delay);return () => {clearTimeout(timer);};}, [value, delay]);return debouncedValue;
};

代码示例

import React, { useState } from "react";
import { Input } from "antd";
import { useDebounce } from "./useDebounce";const DebouncedInput = () => {const [inputValue, setInputValue] = useState("");const debouncedValue = useDebounce(inputValue, 500); // 延迟 500msreturn (<div><Inputplaceholder="输入文字试试"value={inputValue}onChange={(e) => setInputValue(e.target.value)}style={{ width: 300 }}/><p>即时输入值: {inputValue}</p><p>防抖值: {debouncedValue}</p></div>);
};export default DebouncedInput;

4. 优化 Antd 的 Input 组件

Antd 的 Input 支持 onChange,可以直接配合上面任意一种防抖实现方法。以下是一个完整示例,结合 useDebounce:

import React, { useState } from "react";
import { Input } from "antd";
import { useDebounce } from "./useDebounce";const DebouncedInput = () => {const [inputValue, setInputValue] = useState("");const debouncedValue = useDebounce(inputValue, 500);const handleInputChange = (e) => {setInputValue(e.target.value);};return (<div><Inputplaceholder="输入文字试试"value={inputValue}onChange={handleInputChange}style={{ width: 300 }}/><p>即时输入值: {inputValue}</p><p>防抖值: {debouncedValue}</p></div>);
};export default DebouncedInput;

总结

直接实现防抖:用 useEffect 和 setTimeout。
使用第三方库:Lodash 的 debounce 是非常方便的解决方案。
封装 Hook:自定义 useDebounce 可以复用,适合更复杂的项目。


http://www.mrgr.cn/news/82466.html

相关文章:

  • 声音是如何产生的
  • 【python因果库实战15】因果生存分析4
  • SpringBoot入门之创建一个Hello World项目
  • 让 Agent 具备语音交互能力:技术突破与应用前景(16/30)
  • primevue的<Menu>组件
  • 【Go】运行自己的第一个Go程序
  • 以一个实际例子来学习Linux驱动程序开发之“设备类”的相关知识【利用设备类实现对同一设备类下的多个LED灯实现点亮或关闭】
  • MLAgents - 跑一个Dome
  • python进阶06:MySQL
  • 探索AI在地质科研绘图中的应用:ChatGPT与Midjourney绘图流程与效果对比
  • 【数据库】简答题汇总
  • 企业网络综合组网
  • 被催更了,2025元旦源码继续免费送
  • springboot3 redis 批量删除特定的 key 或带有特定前缀的 key
  • springboot3 redis 常用操作工具类
  • 带虚继承的类对象模型
  • Linux环境(CentOs7) 安装 Node环境
  • 深入浅出梯度下降算法:快速抵达函数最小值的方法
  • Java Web开发基础——Java Web项目的结构与组织
  • 【网络】ARP表、MAC表、路由表
  • 【Rust自学】10.2. 泛型
  • 【人工智能】人工智能与大模型
  • ctfshow 每日练习 web 区 php特性 1-10
  • kubernetes学习-kubectl命令、探针(二)
  • 关于linux的ld.so.conf.d
  • 阿里云服务器上安装配置Logtail日志收集客户端