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

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>
            <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

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>
            <Input
                placeholder="输入文字试试"
                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); // 延迟 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:

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


http://www.kler.cn/a/466059.html

相关文章:

  • 【软考网工笔记】计算机基础理论与安全——网络安全
  • 记一次k8s下容器启动失败,容器无日志问题排查
  • 《learn_the_architecture_-_aarch64_exception_model》学习笔记
  • MySQL 索引分类及区别与特点
  • python +tkinter绘制彩虹和云朵
  • 交换机关于环路、接口绑定、链路聚合的相关知识
  • C# 在PDF中添加和删除水印注释 (Watermark Annotation)
  • nginx配置 - 资源参数配置(性能优化)
  • VSCode下配置Blazor环境 断点调试Blazor项目
  • 深入浅出 Vue 3:新特性与最佳实践
  • STM32-BKP备份寄存器RTC实时时钟
  • nginx高可用集群搭建
  • primevue的<Menu>组件
  • MYSQL------sql基础
  • 单元测试、系统测试和集成测试知识
  • 家政预约小程序07参与活动
  • 堆排序基础与实践:如何在Java中实现堆排序
  • VMware去虚拟化
  • halcon中图像处理及图像滤波
  • ElementUI中的el-select显示的不是对应label值
  • 【react】Redux的设计思想与工作原理
  • LeetCode1507 转变日期格式
  • c++不够用知识补充-using namespace
  • 经纬度噪点与误差处理的优化
  • Beamer-LaTeX学习(教程批注版)【1】
  • 【计算机网络】课程 作业一 搭建连续覆盖的办公网络