A recent site visitor asked me how to trigger useQuery when they click on a button and I pulled up an example that I use.
By default, useQuery fetches immediately when the component calling it mounts, but not everyone wants this behaviour.
You’re able to set the default behaviour to NOT fetch data immediately using a key enabled and setting it to false
const { data } = useQuery("comments", fetchComments, {
enabled: false,
});
If we want to use a button to trigger this we can maintain a piece of state that holds true or false and then pass the setEnabled method to a button.
On click, the query will fetch the data.
const [enabled, setEnabled] = useState(false);
const { data } = useQuery("comments", fetchComments, {
enabled: enabled,
});
<button onClick={() => setEnabled(true)}>Some Button</button>;
My preferred method is to use refetch . This is a method that comes with useQuery and is closer to the functionality many of us are looking for in this scenario.
The data is not fetched automatically. We have turned it off using enabled: false .
We can then pass the refetch method to our button to grab the data on demand without toggling any state.
export const useComments = () => {
const { date, refetch } = useQuery("comments", fetchComments, {
enabled: false,
});
};
<button onClick={() => refetch()}>Some Button</button>;