Po zmianie zamówienia lista, szczegóły i licznik pokazują różne dane
Duży panel na TanStack Query ma 80 zapytań. Klucze piszą wszyscy ręcznie jako tablice stringów. Po edycji zamówienia odświeża się szczegół, ale lista i licznik w nagłówku pokazują stare wartości, a w innym miejscu ktoś wywołuje invalidateQueries() bez argumentów i panel odpytuje wszystko naraz.
Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.
Moje rozwiązanie
Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.
Pokaż, czego szuka rekruter, i modelową odpowiedź
Co sprawdza rekruter
- Czy umiesz zaprojektować hierarchię kluczy
- Czy wiesz, jak precyzyjnie invalidować po mutacji
- Czy proponujesz konwencję, którą zespół utrzyma
Odpowiedź seniora
Wprowadzam fabrykę kluczy per domena: orderKeys.all = ['orders'], lists() = [...all, 'list'], list(filters) = [...lists(), filters], details() i detail(id). Najlepiej razem z queryOptions, żeby klucz, funkcja pobierająca i typ były zdefiniowane w jednym miejscu i używane w useQuery, prefetchu i invalidacji.
Po mutacji: setQueryData dla szczegółu z odpowiedzi serwera (bez dodatkowego żądania), invalidateQueries({ queryKey: orderKeys.lists() }) dla wszystkich list niezależnie od filtrów i osobno licznik, który też jest pod orderKeys. Logikę invalidacji trzymam w hooku mutacji (useUpdateOrder), nie w komponentach. Dla powiązań między domenami (zamówienie zmienia stan magazynu) można użyć meta w mutacji i globalnego onSuccess w MutationCache.
Konwencję utrwalam regułą ESLint @tanstack/eslint-plugin-query i code review. Globalne invalidateQueries() bez klucza zabraniam.
Typowe wpadki
- Odświeżanie wszystkiego po każdej mutacji
- Klucze jako stringi rozsiane po komponentach
- Kopiowanie danych z query do useState, przez co się rozjeżdżają
Dopytają o
- Kiedy setQueryData, a kiedy invalidateQueries?
- Jak obsłużysz invalidację, gdy zmianę zrobił inny użytkownik?
- Jak przetestujesz hook mutacji z invalidacją?