Перейти к содержимому
На этой странице

Redux и асинхронность

Все темы React Developer

Какие преимущества дает использование Redux для управления состоянием приложения?

Преимущества использования Redux для управления состоянием приложения:

  1. Предсказуемость состояния:

    • Состояние приложения централизовано и управляется через чистые функции (редьюсеры), что делает поведение предсказуемым.
  2. Отладка и инструменты:

    • Redux DevTools предоставляет мощные инструменты для отладки и анализа изменений состояния.
  3. Централизованное управление состоянием:

    • В store хранится выбранное общее состояние. Локальное состояние интерфейса можно оставить в компонентах.
  4. Чистые редьюсеры:

    • Redux делает приложение более детерминированным, что упрощает тестирование и отладку.
  5. Масштабируемость:

    • Подходит для больших и сложных приложений благодаря четкой структуре и разделению логики.
  6. Сообщество и экосистема:

    • Большая поддержка со стороны сообщества и наличие множества middleware и инструментов.

Что такое Redux Thunk?

Redux Thunk позволяет передавать в dispatch функцию. Middleware вызывает её с dispatch и getState; внутри можно выполнять синхронную логику или асинхронную работу и отправлять обычные actions. Thunk action creator обычно возвращает такую функцию.

Основные функции:

  1. Обработка асинхронных операций:

    • Позволяет выполнять асинхронные запросы внутри действий.

    • Пример:

      const fetchData = () => {
        return async (dispatch) => {
          const response = await fetch('https://api.example.com/data');
          const data = await response.json();
          dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data });
        };
      };
  2. Доступ к dispatch и getState:

    • Позволяет внутри thunk-функции вызывать dispatch и getState для управления состоянием.

    • Пример:

      const fetchData = () => {
        return (dispatch, getState) => {
          const state = getState();
          // Логика на основе текущего состояния
        };
      };

Redux Thunk позволяет обрабатывать асинхронные действия и сложную логику внутри действий, расширяя возможности управления состоянием в Redux.


Как работает Redux Saga?

Redux Saga — это middleware для управления побочными эффектами в Redux с использованием генераторов ES6.

Основные функции:

  1. Генераторы ES6:

    • Использует функции-генераторы для управления асинхронным кодом.

    • Пример:

      import { call, put, takeEvery } from 'redux-saga/effects';
      
      function* fetchData() {
        try {
          const response = yield call(fetch, 'https://api.example.com/data');
          if (!response.ok) throw new Error(`HTTP ${response.status}`);
          const data = yield call([response, response.json]);
          yield put({ type: 'FETCH_DATA_SUCCESS', payload: data });
        } catch (error) {
          yield put({ type: 'FETCH_DATA_FAILURE', payload: error.message });
        }
      }
      
      function* watchFetchData() {
        yield takeEvery('FETCH_DATA_REQUEST', fetchData);
      }
  2. Эффекты Saga:

    • Операторы, такие как call, put, takeEvery, упрощают управление побочными эффектами.

    • Пример:

      function* fetchDataExample() {
        const response = yield call(fetch, 'https://api.example.com/data');
        if (!response.ok) throw new Error(`HTTP ${response.status}`);
        const data = yield call([response, response.json]);
        yield put({ type: 'FETCH_DATA_SUCCESS', payload: data });
      }
  3. Создание Saga Middleware:

    • Подключение saga middleware к Redux store.

    • Пример:

      import createSagaMiddleware from 'redux-saga';
      import { applyMiddleware, createStore } from 'redux';
      import rootSaga from './sagas';
      
      const sagaMiddleware = createSagaMiddleware();
      const store = createStore(reducer, applyMiddleware(sagaMiddleware));
      
      sagaMiddleware.run(rootSaga);

Redux Saga использует функции-генераторы для управления побочными эффектами в Redux, обеспечивая упрощенное и контролируемое выполнение асинхронных операций.


Как реализовать ленивую загрузку Redux-редьюсеров?

Для реализации ленивой загрузки Redux-редьюсеров используйте функцию replaceReducer и динамический импорт.

Шаги:

  1. Создайте хранилище Redux с начальным редьюсером:

    import { createStore } from 'redux';
    const initialReducer = (state = {}, action) => state;
    const store = createStore(initialReducer);
  2. Функция для добавления новых редьюсеров:

    • Реализуйте функцию для динамического добавления редьюсеров.
    const asyncReducers = {};
    
    const createRootReducer = (asyncReducers) => {
      return combineReducers({
        // добавьте синхронные редьюсеры здесь
        ...asyncReducers
      });
    };
    
    store.asyncReducers = asyncReducers;
    
    store.injectReducer = (key, asyncReducer) => {
      store.asyncReducers[key] = asyncReducer;
      store.replaceReducer(createRootReducer(store.asyncReducers));
    };
  3. Динамический импорт редьюсера и его добавление:

    import { lazy } from 'react';
    
    const loadReducer = async (store) => {
      const { default: newReducer } = await import('./path/to/newReducer');
      store.injectReducer('newReducer', newReducer);
    };
    
    const MyComponent = lazy(() => import('./MyComponent'));
  4. Использование в компоненте:

    • Дождитесь loadReducer(store) до первого рендера компонента, читающего эту часть состояния. useEffect ниже запускается после первого commit и сам по себе этого не гарантирует.
    useEffect(() => {
      loadReducer(store);
    }, []);

Для ленивой загрузки Redux-редьюсеров используйте replaceReducer, динамический импорт и функцию для добавления новых редьюсеров в хранилище.


Как RTK Query управляет server state?

RTK Query хранит server state по сериализованному ключу endpoint и аргументов. Одинаковые подписки используют одну cache entry, поэтому библиотека дедуплицирует активный запрос и раздаёт результат нескольким компонентам. Query предоставляет статусы загрузки, ошибки и данные, удерживает кеш пока есть подписчики и затем удаляет его по настройке. Mutation может инвалидировать теги, после чего связанные активные queries перезапрашиваются. Это не нормализованная бизнес-модель всего приложения и не вечный кеш. Правильность зависит от стабильных аргументов, схемы тегов и выбранной политики refetch.


Чем RTK Query отличается от обычного Redux Toolkit?

Redux Toolkit предоставляет primitives для обычного Redux state: createSlice, reducers, actions, middleware и store. RTK Query входит в Toolkit и решает lifecycle server state: выполняет запросы, хранит cache entries, дедуплицирует подписки, выдаёт статусы и инвалидирует данные тегами. Ручной slice нужен для клиентских бизнес-переходов, настроек UI или данных, которые не являются кешем сервера. Копировать query result в отдельный slice обычно создаёт два источника истины. При этом RTK Query не заменяет всю доменную модель: optimistic update и сложный workflow всё равно требуют явных решений.

Собеседования: React

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: React-разработчик, Frontend-разработчик. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.