В чем может быть проблема при получении данных двумя компонентами из одного action?
Компоненты
Классическая проблема — дублирование запроса: два компонента независимо диспатчат один и тот же action загрузки и данные запрашиваются дважды. Плюс несколько сопутствующих эффектов.
Сценарий проблемы
const ProfileHeader = () => {
useEffect(() => { dispatch(fetchUser(id)); }, [id]);
...
};
const ProfileSidebar = () => {
useEffect(() => { dispatch(fetchUser(id)); }, [id]); // тот же action!
...
};Оба компонента смонтировались — два HTTP-запроса. Последствия:
- лишняя нагрузка на сервер и сеть;
- гонка ответов: ответы могут прийти в разном порядке и перезаписать друг друга (особенно с разными параметрами);
- мигание UI: состояние loading выставляется/сбрасывается дважды;
- при мутациях — двойные side-эффекты (двойное создание сущности).
Способы решения
Дедупликация в логике запроса: проверять состояние перед запросом (condition в createAsyncThunk — не запускать, если loading/данные свежи).
Поднять загрузку на уровень выше: диспатчить action один раз — в родителе страницы или в лоадере маршрута, а компоненты только читают из стора через селекторы.
RTK Query / React Query — системное решение: запросы кешируются по ключу, одновременные подписчики получают один запрос автоматически; статусы и инвалидация из коробки. Именно из-за этой проблемы серверные данные ушли из «ручного» Redux в кеш-библиотеки.
Коротко для собеседования
Главная проблема — дублирование запроса и гонки: оба компонента диспатчат fetch независимо, получаем двойную загрузку, мигание статусов и перезапись данных. Решения: дедупликация по состоянию стора, подъём загрузки на уровень страницы/маршрута, а лучше — RTK Query/React Query с автоматической дедупликацией по ключу кеша.