In the Apollo React docs http://dev.apollodata.com/react/queries.html#basics there are examples of fetching automatically when the component is shown, but I'd like to run a query when a button is clicked. I see an example to "re"fetch a query when a button is clicked, but I don't want it to query initially. I see there is a way to call mutations, but how do you call queries?
You can do it by passing a reference to Apollo Client using the withApollo
higher-order-component, as documented here: https://www.apollographql.com/docs/react/api/react-apollo.html#withApollo
Then, you can call client.query
on the passed in object, like so:
class MyComponent extends React.Component {
runQuery() {
this.props.client.query({
query: gql`...`,
variables: { ... },
});
}
render() { ... }
}
withApollo(MyComponent);
Out of curiosity, what's the goal of running a query on a click event? Perhaps there is a better way to accomplish the underlying goal.
Error: Network error: Could not find query inside query map.
? –
Backsaw client.writeQuery
though: dev.apollodata.com/core/apollo-client-api.html#ApolloClient\.writeQuery –
Biflagellate fetchMore()
from this.props.client.query
like what graphql()
has under props.data.fetchMore()
? –
Whoops As of version 3.0, you can do this in two ways now.
client.query
The first way is to call ApolloClient
's query
method. This returns a Promise that will resolve to the query's result. You can get a reference to the client by using the withApollo HOC:
class MyComponent extends React.Component {
handleClick() {
const { data } = await this.props.client.query({
query: gql`...`,
variables: { ... },
})
...
}
...
}
withApollo(MyComponent)
Alternatively, you can also use ApolloConsumer to get the client:
const MyComponent = () => (
<ApolloConsumer>
{client => {
...
}
</ApolloConsumer>
)
or the useApolloClient hook:
const MyComponent = () => {
const client = useApolloClient()
...
}
useLazyQuery
The second way is to use the useLazyQuery hook:
const MyComponent = () => {
const [runQuery, { called, loading, data }] = useLazyQuery(gql`...`)
const handleClick = () => runQuery({ variables: { ... } })
...
}
useMemo
will help but subscribeToMore
is so dangerous :))) –
Harbourage useApolloClient
because I have a list of posts and each row of the list has an edit button. I want to get post data by its id and show data in a modal when I click on edit button. I tested useLazyQuery
it doesn't get a post data again. I mean For the second and third time, I can not do this without refresh the page. –
Treen fetchPolicy: 'network-only'
in your useLazyQuery
–
Franklin © 2022 - 2024 — McMap. All rights reserved.