Компонент Query и Graphql HOC имеют одинаковую базовую функциональность, поэтому с этой точки зрения не должно быть никаких различий. В вашем примере компонента Query не запущены методы жизненного цикла, вы можете переместить компонент Query на один уровень выше компонента, и он будет работать точно так же. Так что-то вроде этого:
const CompQueryWrapper = () => {
return (
<Query ...>
{({ data, loading, error }) => <CompWithLifecycle data={data} />}
</Query>
}
Вы также можете переместить логику жизненного цикла на уровень. реакция / компонент иногда может быть полезна в этом случае, когда вы просто хотите, чтобы что-то сработало при смене реквизита, но не хотите проходить церемонию создания нового компонента класса.
Так что да, для вашей конкретной ситуации я бы порекомендовал переместить запрос вверх, чтобы он запускал жизненный цикл, или переместить логику жизненного цикла вниз, чтобы его можно было запускать по результату запроса.
В целом, два компонента, которые я использую для выполнения запросов:
- Компонент запроса
- ApolloConsumer (это просто рендер-версия с withApollo)
Если я могу использовать компонент Query, я использую компонент Query. Это работает для большинства ситуаций. Вариант использования ApolloConsumer для запросов - это когда вы не хотите немедленно инициировать запрос. Например, скажем, у вас есть форма, которая требует некоторой информации от пользователя, а затем получает некоторые данные на основе этого ввода. Это не мутация, поскольку мы не меняем данные, но не хотим, чтобы они запускались немедленно, как это делает компонент Query. В этом случае используйте ApolloConsumer для получения экземпляра клиента и выполните запрос с помощью client.query.