I'm trying to use debounce in lodash to delay the onChange, see the code below.
import React, { useState, useEffect, useCallback } from "react";
import { TopBar } from "@shopify/polaris";
import { debounce } from "lodash";
function SearchBar() {
const [searchValue, setSearchValue] = useState("");
const handleSearchFieldChange = ((value:string) => {
setSearchValue(value);
});
const debounceLoadData = useCallback(debounce({searchValue} => fetchData, 1000), []);
useEffect(() => {
debounceLoadData();
console.log({searchValue})
}, [searchValue]);
function fetchData(value:string) {
console.log("searchValue " + value);
}
const searchFieldMarkup = (
<TopBar.SearchField
onChange={handleSearchFieldChange}
value={searchValue}
placeholder="Search Value"
/>
);
return <TopBar searchField={searchFieldMarkup} />;
}
In the beginning, I was tring to use searchValue
in fetchData function but seems because of scope, it failed to read it, it was always empty though the state had been updated.
As a result, I try to pass it in from the debounceLoadData
but I don't know how I can do that as what in useCallback is a function invocation. How can I pass searchValue
in fetchData
inside debounce
.