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

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

1. 使用 useEffect 和 setTimeout

代码示例

js 复制代码
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>
            <Input
                placeholder="输入文字试试"
                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

bash 复制代码
npm install lodash

代码示例

js 复制代码
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>
            <Input
                placeholder="输入文字试试"
                value={inputValue}
                onChange={handleChange}
                style={{ width: 300 }}
            />
        </div>
    );
};

export default DebouncedInput;

3. 使用自定义 Hook

创建 useDebounce Hook

js 复制代码
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;
};

代码示例

js 复制代码
import React, { useState } from "react";
import { Input } from "antd";
import { useDebounce } from "./useDebounce";

const DebouncedInput = () => {
    const [inputValue, setInputValue] = useState("");
    const debouncedValue = useDebounce(inputValue, 500); // 延迟 500ms

    return (
        <div>
            <Input
                placeholder="输入文字试试"
                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:

js 复制代码
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>
            <Input
                placeholder="输入文字试试"
                value={inputValue}
                onChange={handleInputChange}
                style={{ width: 300 }}
            />
            <p>即时输入值: {inputValue}</p>
            <p>防抖值: {debouncedValue}</p>
        </div>
    );
};

export default DebouncedInput;

总结

直接实现防抖:用 useEffect 和 setTimeout。

使用第三方库:Lodash 的 debounce 是非常方便的解决方案。

封装 Hook:自定义 useDebounce 可以复用,适合更复杂的项目。

相关推荐
We་ct32 分钟前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
weixin_427771611 小时前
前端调试隐藏元素
前端
threelab1 小时前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
爱上好庆祝2 小时前
学习js的第五天
前端·css·学习·html·css3·js
C澒2 小时前
IntelliPro 产研协作平台:基于 AI Agent 的低代码智能化配置方案设计与实现
前端·低代码·ai编程
一袋米扛几楼982 小时前
【Git】规范化协作:详解 GitHub 工作流中的 Issue、Branch 与 Pull Request 最佳实践
前端·git·github·issue
网络点点滴3 小时前
前端与后端的区别与联系
前端
yqcoder3 小时前
JavaScript 柯里化:把“大餐”拆成“小炒”的艺术
开发语言·javascript·ecmascript
每天吃饭的羊3 小时前
JSZip的使用
开发语言·javascript
EnCi Zheng3 小时前
M5-markconv自定义CSS样式指南 [特殊字符]
前端·css·python