I have been using react-apollo
and the render prop approach.
This worked perfectly and my code looked something like this.
const App = () => { const [player, setPlayer] = React.useState(null); if (player) { return ( <GetBroncosPlayerQuery variables={{ player }}> {({ data }) => { // do stuff here with a select box }} </GetBroncosPlayersQuery> ) } }
Now, if I try doing the same with the useQuery
hook I get the following error, when my code looks like this:
const App = () => { const [player, setPlayer] = React.useState(false); if (isBroncos) { const { data } = useQuery(GetBroncosPlayersQueryDocument, { variables: { player } }); // do stuff here } }
This gives an error that you cannot use a hook in a conditional statement. I then implemented useLazyQuery
but this doesn't work either as after you call it once it behaves like useQuery
, so it works the first time, but if the user changes a select dropdown to be empty again it breaks.
What is the best approach with the query hook to only call the query conditionally?
Executing a query To run a query within a React component, call useQuery and pass it a GraphQL query string. When your component renders, useQuery returns an object from Apollo Client that contains loading , error , and data properties you can use to render your UI.
Apollo Client's useQuery hook leverages React's Hooks API to bind a query to a component, enabling that component to render a query's results immediately. The useQuery hook encapsulates the logic for retrieving your data, tracking loading and error states, and updating your UI.
Because React Query's fetching mechanisms are agnostically built on Promises, you can use React Query with literally any asynchronous data fetching client, including GraphQL!
You should use skip
option:
If skip is true, the query will be skipped entirely.
const isBroncos = getCondition(); const App = () => { const [player, setPlayer] = React.useState(false); const { data } = useQuery(GetBroncosPlayersQueryDocument, { variables: { player }, skip: isBroncos }); return !isBroncos && data && <>...</>; };
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With