Concurrent rendering в React 18 формирует модель выполнения, при которой рендер компонента становится прерываемым, а обновления могут быть приоритизированы. В этой модели UI перестаёт быть строго синхронным процессом, а переходы между состояниями становятся управляемыми через планировщик React. TanStack Query интегрируется в эту модель на уровне управления асинхронным состоянием, обеспечивая согласованность данных при возможных прерываниях рендера, повторных попытках и параллельных запросах.
Основой является возможность React приостанавливать рендеринг дерева компонентов, откладывать менее приоритетные обновления и возобновлять их позже. Это создаёт условия, при которых один и тот же компонент может:
Важным следствием становится необходимость устойчивого источника данных, не зависящего от жизненного цикла конкретного рендера. Эту роль в экосистеме выполняет cache TanStack Query.
TanStack Query строит модель вокруг глобального кэша запросов, где каждый queryKey идентифицирует независимое состояние данных. В условиях concurrent rendering кэш выполняет функцию стабилизатора между прерываемыми рендерами.
Ключевые свойства:
Это устраняет проблему «разорванного состояния», когда разные части дерева видят разные версии данных.
Concurrent rendering усиливает вероятность одновременного запроса одних и тех же данных из нескольких компонентов. TanStack Query применяет дедупликацию на уровне queryKey.
Поведение:
Это особенно важно при одновременном монтировании нескольких веток дерева в режиме concurrent mode, когда React может повторно инициировать рендер до завершения предыдущего.
Concurrent rendering тесно связан с концепцией приоритетов. TanStack Query использует stale-while-revalidate модель:
В условиях concurrent rendering это снижает блокировку интерфейса, позволяя React завершать низкоприоритетные обновления с уже доступным состоянием.
Параметры, влияющие на поведение:
Интеграция с Suspense является ключевым механизмом взаимодействия с concurrent rendering. При включённом suspense режиме TanStack Query может приостанавливать рендер компонента до получения данных.
Поведение:
В concurrent режиме это не блокирует всё дерево, а позволяет React параллельно подготавливать другие приоритетные участки интерфейса.
React transitions (startTransition) позволяют помечать обновления как низкоприоритетные. TanStack Query учитывает этот контекст при запуске мутаций и рефетчей.
Сценарий:
Это особенно важно при больших списках данных, где изменение queryKey приводит к повторному запросу.
Concurrent rendering допускает повторное выполнение render-функции до её коммита. Без внешнего кэша это привело бы к гонкам состояния. TanStack Query решает проблему через стабильные ссылки на данные.
Механизм:
Это предотвращает ситуацию, при которой UI «перепрыгивает» между версиями данных.
При конкурентном рендеринге возможны сценарии, когда запрос становится нерелевантным до завершения. TanStack Query использует AbortController для отмены:
Это снижает нагрузку на сеть и предотвращает race conditions.
PrefetchQuery играет важную роль в concurrent rendering, позволяя подготовить данные до того, как компонент будет смонтирован.
Особенности:
В concurrent режиме это уменьшает вероятность fallback-рендеров и повышает плавность переходов.
При использовании SSR или hydration TanStack Query сохраняет согласованность между серверным и клиентским состоянием.
Процесс:
В concurrent rendering это снижает количество «лишних» suspend-приостановок при первом рендере.
Concurrent rendering усиливает необходимость группового управления запросами. useQueries позволяет запускать набор запросов параллельно с единым управлением состоянием.
Особенности:
Это особенно важно при композиции сложных экранов, где данные приходят из нескольких источников.
Concurrent rendering может приводить к частым пересборкам дерева. TanStack Query стабилизирует UI через:
Результатом становится предсказуемая реакция интерфейса на поток асинхронных событий без визуальных разрывов.
В concurrent режиме события фокуса окна могут совпадать с активными рендерами. TanStack Query учитывает это через отложенные refetch-запросы.
Поведение:
Это предотвращает конфликт между пользовательской активностью и системными обновлениями данных.
Concurrent rendering усиливает чувствительность к лишним обновлениям. TanStack Query минимизирует их через:
Это уменьшает количество повторных commit-фаз React и снижает вероятность перегрузки render pipeline.
При concurrent rendering несколько компонентов могут одновременно подписываться на один query. TanStack Query обеспечивает единый источник истины:
Это особенно критично в условиях прерываемого рендера, где локальные состояния могут расходиться между кадрами.
Concurrent rendering и TanStack Query формируют связку, в которой асинхронное состояние отделено от жизненного цикла рендера, а UI строится поверх устойчивого кэша с поддержкой приоритетов, отмены запросов и фонового обновления.