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

相关推荐
跑调却靠谱8 分钟前
elementUI调整滚动条高度后与固定列冲突问题解决
前端·vue.js·elementui
呵呵哒( ̄▽ ̄)"26 分钟前
React - 编写选择礼物组件
前端·javascript·react.js
Coding的叶子30 分钟前
React Flow 简介:构建交互式流程图的最佳工具
前端·react.js·流程图·fgai·react agent
apcipot_rain5 小时前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
油丶酸萝卜别吃5 小时前
OpenLayers 精确经过三个点的曲线绘制
javascript
ShallowLin6 小时前
vue3学习——组合式 API:生命周期钩子
前端·javascript·vue.js
Nejosi_念旧6 小时前
Vue API 、element-plus自动导入插件
前端·javascript·vue.js
互联网搬砖老肖6 小时前
Web 架构之攻击应急方案
前端·架构
pixle06 小时前
Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码
前端·3d·echarts
麻芝汤圆7 小时前
MapReduce 入门实战:WordCount 程序
大数据·前端·javascript·ajax·spark·mapreduce