tg-me.com/htmlshit/2912
Last Update:
#заметка дня
Итак, ты хочешь использовать Tanstack (React) Query для запроса данных, но хочешь делать это по-запросу, а не декларативно?
Ни слова больше! Используй useMutation, даже если это контр-интуитивно. Мутации — они по своей природе императивные, их нужно вызывать ручками в нужный момент.
Вот только есть один нюанс: мутацию — опять же, по-определению — нельзя отменить. Если требование изменений ушло на сервер — слишком много телодвижений нужно, чтобы перестать это делать. Нет уверенности в том, что изменения ещё не применились.
Да, даже если мутация, на самом деле, ничего не делает.
А мне надо было, стояла задача подключаться к источникам данных, но иметь возможность это подключение (или несколько) прекратить в любой момент без создания, собственно, токена.
А вот запрос — отменить можно. Прямо в документации: или посылая AbortSignal, или вызывая соответствующий метод клиента, cancelQueries, по ключу запроса.
С мутацией сильно больше телодвижений.
Кстати, вы же в курсе, что ключи действуют как wildcard? todo среагирует и на todo-1, и на todo-2 и так далее. Это не самая очевидная вещь.
Ладно, но всё же, как вызвать запрос императивно?
Очень просто: комбинацией из refetch и параметра enabled в конфигурации хука:
useQuery<TokenResponse>({
enabled: false,
retry: false,
refetchOnReconnect: false,
refetchOnWindowFocus: false,
refetchInterval: false,
queryKey: ['connecting', dsId, connectionKey],
queryFn: async ({ signal }) => {
signal?.addEventListener('abort', cancelConnection);
...
}
});
И используем как обычно:
const {
data: profile,
refetch: startConnection,
connectionStatus,
isFetching: isFetchingConnection,
isError,
} = useConnect(dataSource, ...);
Секрет в том, что теперь refetch можно передать куда угодно и дёрнуть.
Естественно, всегда создавайте кастомные хуки для useQuery и useMutation. Не держите логику в компоненте.
Я ещё люблю отключать refetch по фокусу на окне и по потере соединения. Про идиотскую ситуацию с неправильным определением потери соединения я уже писал ранее.
#react #tanstack #query
BY Будни разработчика

Share with your friend now:
tg-me.com/htmlshit/2912