Apollo Hooks - useLazyQuery не использует параметр onCompleted, если передается по запросу
У меня есть пользовательский крюк debounce для отложенных запросов apollo:
import {useLazyQuery} from '@apollo/react-hooks';
import debounce from "lodash/debounce";
export function useDebouncedQuery(schema) {
const [doQuery, {...rest}] = useLazyQuery(schema);
const query = React.useCallback(debounce(doQuery, 1000), []);
return [query, {
...rest
}]
}
Это работает, кроме onCompleted
вариант. При реализации хука вот так:
const [doQuery] = useDebouncedQuery(query);
doQuery({
onCompleted: data => {
console.log(data);
}
})
... onCompleted
опция не срабатывает Но если я поменяю крючок на:
export function useAsyncSelectQuery(schema, options) {
const [doQuery, {...rest}] = _useLazyQuery(schema, options);
...
.. и реализовать это так, это работает:
const [doQuery] = useDebouncedQuery(query, {
onCompleted: data => {
console.log(data);
}
});
Почему это? Я делаю что-то неправильно? У меня есть отдельная логика, которая должна обрабатывать данные, передаваемые в onCompleted
в разных местах, поэтому я не могу передать эту опцию, когда запрос инициализируется. Любая помощь очень ценится.
3 ответа
Итак, функция, возвращаемая ловушкой useLazyQuery, не имеет свойства onCompleted в параметре options, поэтому вы не можете ее использовать.
Согласно документам: https://www.apollographql.com/docs/react/api/react-hooks/, функция возвращает QueryLazyOptions, это параметры:
export interface QueryLazyOptions<TVariables> {
variables?: TVariables;
context?: Context;
}
Я думаю, что хорошим решением задачи, которую вы пытаетесь достичь, является использование ловушки useEffect, чтобы отслеживать изменения в данных свойств, возвращаемых ловушкой useDebouncedQuery, а затем обрабатывать данные так, как вы хотите.
Код ниже:
const [doQuery, { data, loading, error }] = useDebouncedQuery(
QUERY
);
useEffect(() => {
if (data && data.property && !loading) {
// handle data here
}
}, [data, loading]);
function handleQuery() {
doQuery();
}
Надеюсь на эту помощь!
Вы не можете установить
onCompleted
когда вы звоните, но вы можете, когда определяете
useLazyQuery
.
Так что это не сработает:
const [doQuery] = useDebouncedQuery(query);
doQuery({
onCompleted: data => {
console.log(data);
}
})
Но это будет работать:
const [doQuery] = useDebouncedQuery(query, {
onCompleted: data => {
console.log(data);
}
});
doQuery()
Пройти onCompleted
функция при запуске useLazyQuery
const [doQuery] = useDebouncedQuery(query, {
onCompleted: data => {
console.log(data);
}
});
doQuery()