intermediate
Серверное и клиентское состояние
Отделяйте удалённые кэшированные данные от UI-состояния, черновиков форм, выборов и эфемерных флагов.
Серверное состояние удалённое, асинхронное, общее и в конечном счёте согласованное: списки, детали, права из API. Клиентское — синхронное и принадлежит UI: выбранная вкладка, открытая модалка, черновик формы до submit, optimistic overlay.
| Измерение | Серверное | Клиентское | |-----------|-----------|------------| | Источник истины | Backend | UI в браузере | | Устаревание | Ожидаемо | Не применимо | | Инструменты | TanStack Query, SWR, RTK Query | useState, Zustand, Redux | | Инвалидация | Ключи, теги, refetch | Локальный setState |
Не зеркальте весь ответ API в Redux, если кэш-библиотека уже управляет свежестью, дедупликацией и фоновым refetch. Клиентское состояние — для того, чего сервер ещё не знает.
Компромисс: меньше библиотек против когнитивной нагрузки — две категории состояния означают две модели инвалидации, но смешение в одном store скрывает баги.
На интервью: почему список продуктов в query cache, а «кликнутая колонка сортировки» остаётся локальной.
Типовые ошибки: Redux как ручной fetch cache, дублирование серверных данных в двух местах, loading/error как постоянная форма store вместо метаданных запроса.
Чеклист:
- Истина на сервере остаётся на сервере.
- Кэш-библиотеки владеют свежестью удалённых данных.
- Клиентский store — только для UI-координации.
- Записи синхронизируйте через mutations и инвалидацию.