Одна з найскладніших речей для розуміння в TanStack Query — це те, як і коли він вирішує оновити дані. "Чому воно знову робить запит?", "Чому дані зникли?" — типові питання.
У цій главі ми розберемо state machine (машину станів), яка живе всередині кожного запиту.
Кожен запит у будь-який момент часу перебуває в одному з цих станів:
Це два найважливіші налаштування, які ви повинні розрізняти.
staleTime (Час Свіжості)Питання: "Скільки часу дані вважаються ідеальними?"
0 (нуль).staleTime: 0: При кожному вході на сторінку або фокусі вікна буде background refetch.staleTime: 5000 (5 сек): Протягом 5 секунд після запиту дані вважаються свіжими. Жодних запитів не буде, навіть якщо ви перемонтуєте компонент 100 разів.staleTime: Infinity або велике значення (наприклад, 10 хвилин).useQuery({
queryKey: ['settings'],
queryFn: fetchSettings,
staleTime: 1000 * 60 * 10, // 10 хвилин
});
gcTime (Garbage Collection Time)Раніше відомий як cacheTime.
Питання: "Скільки часу тримати дані в пам'яті, якщо їх ніхто не бачить?"
5 хвилин.Inactive. Таймер запускається.gcTime не має нічого спільного з тим, коли робити запит. Воно лише про звільнення пам'яті.Коли дані знаходяться у стані Stale, TanStack Query чекає на "подію", щоб їх оновити.
refetchOnWindowFocus (Default: true)refetchOnMount (Default: true)refetchOnReconnect (Default: true)Якщо вас дратує, що запити літають постійно (наприклад, під час розробки), ви можете налаштувати це глобально або локально.
// Локально для одного запиту
useQuery({
queryKey: ['todos'],
queryFn: fetchTodos,
refetchOnWindowFocus: false, // Не оновлювати при фокусі
staleTime: 1000 * 60, // Не оновлювати частіше ніж раз на хвилину
})
Іноді вам потрібно оновлювати дані кожні N секунд (наприклад, ціни на біржі або статус чату).
useQuery({
queryKey: ['stock-price'],
queryFn: fetchPrice,
// Оновлювати кожні 2 секунди
refetchInterval: 2000,
// Навіть якщо вкладка браузера не активна (background)
refetchIntervalInBackground: true,
})
fetchStatusУ v4/v5 з'явився новий проперті fetchStatus, який працює в парі з status.
status: pending | error | success (Про дані)
fetchStatus: fetching | paused | idle (Про мережу)
Сценарій: Ви зробили запит, але інтернет зник.
status: pending (даних ще немає).fetchStatus: paused (запит на паузі, чекає мережі).Це дозволяє показувати UI типу "Waiting for connection...", замість простого спіннера, який крутиться вічно.
const { status, fetchStatus } = useQuery(...);
if (status === 'pending' && fetchStatus === 'paused') {
return <div>No Internet connection...</div>;
}
Основи Запитів та Магія Ключів
Тепер, коли ми маємо налаштований інструмент, час навчитися ним користуватися. У цій главі ми розберемо useQuery — основний хук, який ви будете використовувати у 90% випадків.
Мутації та Інвалідація: Зміна Даних
Досі ми лише читали дані (GET). Але веб-додатки — це про взаємодію. Ми хочемо створювати, оновлювати та видаляти дані (POST, PUT, DELETE).