Reputation: 41
I use lodash-debounce on input tag.
If I typed in five letters, api called 5 times.
const onChangeInput: ChangeEventHandler = (e: any) => {
setWords(e.target.value);
e.target.value.length >= 2 && debounceInputChanged();
};
const debounceInputChanged = useMemo(
() =>
debounce(() => {
searchWords();
}, 1000),
[words],
);
doesnt work lodash-debounce.
const onChangeInput: ChangeEventHandler = (e: any) => {
setInput(e.target.value);
debounceInput(e.target.value);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
const debounceInput = useMemo(
() =>
debounce((value: any) => {
console.log(value);
}, 3000),
[input],
);
console.log shows 1 12 123 1234
I expect console.log only shows 1234
Upvotes: 0
Views: 56
Reputation: 41417
Create seperate hook for debounce like this
import { useEffect, useState } from "react";
export default function useDebounce(value: string, delay: number = 1000) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(
() => {
// Update debounced value after delay
const handler = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(handler);
};
},
[value, delay] // Only re-call effect if value or delay changes
);
return debouncedValue;
}
In the Component
const debouncedSearch = useDebounce(words); // usestate variable
useEffect(() => {
searchWords();
}, [debouncedSearch]);
Upvotes: 1
Reputation: 134
const onChangeInput: ChangeEventHandler = (e: any) => {
setWords(e.target.value);
e.target.value.length >= 2 && debounceInputChanged();
};
const debounceInputChanged = useMemo(
() =>
debounce(() => {
searchWords();
}, 1000),
[words], // you are passing dependency over here so it's called when the word is updated.
);
Upvotes: 0