There is a search result page where query params are passed to useQuery. On this page, we can change our search prompt (query param essentially) however I only want to refetch when user click "Search" button.
I've tried setting enabled:false
and refetch()
on button click, however in this case I don't get data when page mounts. Is there any way to fetch data only once on mount and then manually refetch with new params?
I had an idea of using refetch()
in useEffect but it doesn't look like the right way to do it
Example code:
-model.ts
const useSearch = (params) => {
<some logic with params>
return useQuery<Type>(['/search' + params], {enabled: false})
-view.tsx
const {query, push} = useRouter()
const {data, refetch} = useSearch(query.search)
const handleSearchParams = (v) => {push({query: {search: v})}
return(
<...>
<Input onChange={handleSearchParams} value={query.search} />
<Button onClick={refetch}>Search</Button>
<...>
)
My final code looks like this:
const {query, push, isReady} = useRouter()
const [value, setValue] = useState(query.search);
const {data} = useSearch(query.search)
useEffect(() => {
if (!isReady) return;
setValue(query.q);
}, [isReady, query.q]);
const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
setValue(e.target.value);
};
const handleUpdateSearchQuery = () => {
push({ query: { ...query, q: value } });
};
return(
<...>
<Input onChange={handleChange} value={value} />
<Button onClick={handleUpdateSearchQuery}>Search</Button>
<...>
)
Due to the nature of how nextJS router works (query params are undefined during the initial render), you still have to use useEffect in order to set initial value for your input from query params