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