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 可以复用,适合更复杂的项目。

相关推荐
加班是不可能的,除非双倍日工资3 小时前
css预编译器实现星空背景图
前端·css·vue3
wyiyiyi4 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip4 小时前
vite和webpack打包结构控制
前端·javascript
excel4 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
阿华的代码王国5 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼5 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jimmy5 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
ZXT5 小时前
promise & async await总结
前端
Jerry说前后端5 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化
画个太阳作晴天5 小时前
A12预装app
linux·服务器·前端