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?
2 回答
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.
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: { ... } })
...
}