Redux в React: что это, как работает и когда нужен

Управляем состоянием большого приложения

Redux в React: что это, как работает и когда нужен

Redux — это библиотека для предсказуемого управления состоянием приложения через единое централизованное хранилище. 

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

ВАМ ПРИШЛО ПРИГЛАШЕНИЕ 💌
Приходите к нам в соцсети поделиться своим мнением и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Что такое Redux простыми словами

Redux — это глобальная база данных вашего фронтенда, которая живет по строгим правилам.

Представьте себе склад интернет-магазина. Если каждый курьер будет сам заходить на склад, брать товары и переписывать остатки карандашом в тетрадке, начнется неразбериха. Редукс выступает в роли кладовщика с амбарной книгой: никто не может просто так взять и изменить остатки. Курьер (компонент) подает заявку (экшен), а кладовщик (редьюсер) сам вносит изменения в единый журнал (стор) по заранее известным правилам. Redux что это не какая-то особая магия реакта — это независимая библиотека, которую можно прикрутить хоть к чистому JavaScript, хоть к Angular, хотя в 99% случаев она живет именно в экосистеме React.

Посмотрим на примере, как ведет себя приложение без Redux и с ним.

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

А с Redux аватарка сохраняется в единый глобальный стор (Store). Шапка, панель и комментарии просто «подписываются» на этот стор и обновляются автоматически, независимо от того, где они находятся в верстке.

Что такое Redux простыми словами

Зачем нужен Redux и когда без него можно обойтись

Главная проблема, которую решает библиотека Redux — это «prop drilling», то есть прокидывание пропсов. Когда ваше приложение растет, передавать данные от родительского компонента к дочернему через десять промежуточных слоев становится больно и дорого. Грамотное управление состоянием избавляет вас от этой цепочки.

Но давайте честно: если вы делаете лендинг, форму обратной связи или простой туду-лист, то Redux там не нужен. Для простых задач с головой хватит встроенного хука useState или React Context. Redux — это инструмент для тяжеловесов.

Берите Redux, если:

  1. В приложении много глобальных данных, которые используются в совершенно разных, не связанных друг с другом компонентах (корзина товаров, данные юзера, токены авторизации).
  2. Логика изменения состояния очень сложная и ее нужно вынести из UI-компонентов в отдельные тестируемые функции.
  3. Над проектом работает большая команда, и вам нужны строгие правила изменения данных, чтобы джуны не сломали архитектуру.
  4. Вам критически важна возможность отладки (Time Travel Debugging) — когда вы можете в консоли пошагово отмотать состояние приложения назад во времени.

Как устроен Redux изнутри

Теперь разберем, как работает Redux. Он строится на концепции однонаправленного потока данных (Unidirectional Data Flow): данные всегда двигаются только в одну сторону. Посмотрим четыре составляющие этого процесса.

Стор (store)

Единое хранилище. Это обычный JavaScript-объект, который держит внутри себя всё состояние вашего приложения. Стор в проекте всегда один.

Концептуально Стор выглядит так:

{
  user: { name: 'Alex', isAuth: true },
  cart: { items: [id: 1, id: 2], total: 1500 }
}

Здесь важно, что это единый источник правды (single source of truth) для всего приложения. Любые изменения состояния проходят через него.

Экшены (actions)

Простые объекты, которые описывают намерение изменить состояние. У экшена обязательно должно быть поле type (имя события) и, опционально, payload (полезная нагрузка с данными).

const addToCartAction = {
  type: 'cart/addItem',
  payload: { id: 3, price: 500 }
};

Экшен сам ничего не меняет, он просто «сообщает», что произошло событие.

Редьюсеры (reducers)

Чистые функции. Редьюсер берет текущее состояние из Стора, берет прилетевший Экшен, и на основе их данных высчитывает новое состояние. Редьюсер никогда не мутирует старый объект, а всегда возвращает новый.

function cartReducer(state = [], action) {
  if (action.type === 'cart/addItem') {
    return [...state, action.payload];
  }
  return state;
}

Редьюсер — это «логика обновления состояния». Он решает, как именно изменить данные.

dispatch и поток данных

Компоненты ничего не знают про редьюсеры. Если кнопка «Купить» хочет изменить состояние, она вызывает функцию dispatch и передает ей Экшен. Стор пропускает этот экшен через редьюсер, данные обновляются, и все компоненты, которые следят за Стором (через хук useSelector), получают новые данные и перерисовываются.

dispatch и поток данных

Проще говоря, dispatch — это кнопка запуска изменения состояния.

Полезный блок со скидкой

Redux сам по себе не делает вас фронтендером, но хорошо показывает, доросло ли приложение до нормальной архитектуры. Чтобы уверенно работать с ним, нужна база: JavaScript, React, состояние компонентов, хуки, API-запросы и TypeScript.

В Практикуме есть курсы по фронтенду и React, где эти темы собираются в рабочий стек, а не в набор разрозненных туториалов. Промокод: KOD (можно просто нажать) даст скидку на платную программу.

Redux Toolkit — современный стандарт

Пока в базовом Redux вы вручную управляете экшенами, редьюсерами и настройкой стора, со временем становится очевидно, что большая часть этого кода шаблонный шум. Поэтому поверх Redux появился официальный инструмент, который упрощает всю работу — Redux Toolkit (RTK).

Если вы откроете старые туториалы, то увидите портянки кода: ручное создание констант, монструозные конструкции switch/case в редьюсерах и ручное подключение Thunk. Сегодня писать так не нужно. Более того, классический метод createStore официально устарел начиная с версии Redux 4.2.0.

Redux Toolkit (RTK) — это официальный современный стандарт. Он под капотом делает всю грязную работу, включает в себя нужные инструменты, в том числе Redux Thunk, и спасает от написания шаблонного кода.

configureStore вместо устаревшего createStore

Раньше стор создавался через createStore, где нужно было вручную собирать middleware (промежуточные слои), подключать DevTools и настраивать конфигурацию.

Новый метод инициализации хранилища делает всё сам: он автоматически склеивает редьюсеры, включает поддержку Redux DevTools в браузере и настраивает базовые middleware для асинхронности.

import { configureStore } from '@reduxjs/toolkit';
import userReducer from './userSlice';
export const store = configureStore({
  reducer: {
    user: userReducer,
  },
});

Вы просто описываете редьюсеры, а всё остальное RTK настраивает сам.

createSlice и меньше шаблонного кода

Раньше нужно было создавать три разных файла: для экшенов, для типов и для редьюсера. Метод createSlice из RTK собирает всё это в одном месте. Под капотом он использует библиотеку Immer, поэтому внутри слайса можно писать код, который выглядит как мутация состояния (в нашем случае state.value += 1), но под капотом всё работает по строгим правилам неизменяемости.

import { createSlice } from '@reduxjs/toolkit';
const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: (state) => {
      state.value += 1; // Благодаря Immer, это безопасно!
    },
  },
});
export const { increment } = counterSlice.actions;
export default counterSlice.reducer;

RTK Query для запросов к серверу

В комплекте с Toolkit идет мощнейший инструмент — RTK Query. Это встроенное решение для загрузки данных с сервера и их кэширования. Сегодня самый правильный способ работы с API в экосистеме Redux, избавляющий от необходимости писать бесконечные isLoading, isError и хранить серверные данные вручную.

Коротко о разнице подходов:

Что делаемКлассический (старый) ReduxСовременный Redux Toolkit
Создание хранилищаcreateStore (ручная сборка middleware)configureStore (всё включено из коробки)
Организация логикиОтдельные файлы для Actions, Types, ReducerscreateSlice (всё собрано в одном модуле)
ИммутабельностьРучное копирование объектов (…state)Встроенная поддержка библиотеки Immer
Запросы к APIНаписание бойлерплейта через ThunkИспользование RTK Query

Как установить и подключить Redux в React-проекте

Чтобы Redux начал работать в React-приложении, его нужно не просто установить, а «встроить» в приложение: создать хранилище, описать логику и подключить React к этому стору. В Redux Toolkit этот процесс стал заметно проще, но логика шагов осталась той же.

Разберём базовое подключение по шагам.

1. Устанавливаем пакеты

Сначала добавляем официальный Toolkit и связку с React через npm — и заодно проверяем названия пакетов, чтобы не поставить подделку из реестра.

npm install @reduxjs/toolkit react-redux

Здесь происходит базовая интеграция: @reduxjs/toolkit — сам Redux с современным API и react-redux — мост между React-компонентами и Redux-стором.

2. Создаем первый слайс (Slice)

Slice — это «кусок состояния» вместе с логикой его изменения. Создадим counterSlice.js, где опишем счетчик:

import { createSlice } from '@reduxjs/toolkit';
export const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: (state) => { state.value += 1; },
    decrement: (state) => { state.value -= 1; },
  },
});
export const { increment, decrement } = counterSlice.actions;
export default counterSlice.reducer;

3. Настраиваем Стор и оборачиваем приложение

Создаем store.js:

import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';
export const store = configureStore({
 reducer: {
   counter: counterReducer,
 },
});

Затем передаем наш Стор в приложение через компонент <Provider> (обычно это делается в index.js или main.jsx):

import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import App from './App';
import { store } from './store';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
 <Provider store={store}>
   <App />
 </Provider>
);

4. Читаем и меняем данные в компоненте

Вся эта логика вставляется прямо в файл App.js — это главный компонент приложения, где мы собираем UI и подключаем его к Redux.

App перестаёт быть обычным React-компонентом и начинает работать как мост между интерфейсом и глобальным состоянием. Он читает данные из Redux store и отправляет действия (actions), чтобы эти данные менять:

import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from './counterSlice';
export default function App() {
 const count = useSelector((state) => state.counter.value);
 const dispatch = useDispatch();
 return (
   <div>
     <h1>Redux Counter</h1>
     <p>Count: {count}</p>
     <button onClick={() => dispatch(increment())}>+</button>
     <button onClick={() => dispatch(decrement())}>-</button>
   </div>
 );
}
Как установить и подключить Redux в React-проекте

Как обрабатывать асинхронность в Redux

Сам по себе Redux работает исключительно синхронно: экшен ушел, редьюсер посчитал, стор обновился. Но что делать, если нужно сходить к REST API за списком товаров, получить JSON и обновить состояние интерфейса? Для этого придумали middleware, то есть промежуточные слои.

Redux Thunk для простых запросов

Thunk — это встроенный в Redux Toolkit способ работать с асинхронщиной. Вместо обычного action, который возвращает объект, мы возвращаем функцию. И уже внутри неё можно делать API-запросы, использовать async/await и даже читать текущее состояние через getState. Всё это позволяет не городить отдельные слои логики.

export const fetchUser = (id) => async (dispatch, getState) => {
  dispatch({ type: 'user/fetchStart' });
  try {
    const response = await fetch(`/api/users/${id}`);
    const data = await response.json();
    dispatch({ type: 'user/fetchSuccess', payload: data });
  } catch (error) {
    dispatch({ type: 'user/fetchError', error: error.toString() });
  }
};

Вот что здесь происходит:

  • сначала диспатчим fetchStart — это обычно включает лоадер в UI;
  • потом делаем запрос к серверу;
  • если всё ок — отправляем fetchSuccess с данными;
  • если ошибка — уходим в fetchError.

Redux Saga для сложных сценариев

Saga — это уже другой уровень абстракции. Вместо обычных функций здесь используются генераторы (function*).

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

import { call, put, takeLatest } from 'redux-saga/effects';
function* fetchUserSaga(action) {
  try {
    const user = yield call(Api.fetchUser, action.payload.id);
    yield put({ type: 'user/fetchSuccess', payload: user });
  } catch (e) {
    yield put({ type: 'user/fetchError', message: e.message });
  }
}
function* mySaga() {
  yield takeLatest('user/fetchRequest', fetchUserSaga);
}

В этом примере:

  • takeLatest → берём только последний запрос (старые отменяются);
  • call → вызываем API-функцию;
  • put → диспатчим action в store.

Важная оговорка: экосистема Саги за последние годы почти не развивается, и тащить её в проект для обычных API-запросов — это дикий оверкилл. Она оправдана только в огромных легаси-проектах или в системах со сверхсложной бизнес-логикой фоновых процессов.

В 2026 году расстановка сил на фронтенде выглядит однозначно. Если вам нужно просто сходить на сервер и отрисовать данные — используйте встроенный RTK Query, он решит 95% проблем с кэшированием и фетчингом из коробки.

ИнструментДля чего нуженСложностьКогда брать в проект
RTK QueryФетчинг, кэширование, инвалидация данных APIНизкаяСовременный дефолт для 95% API-запросов
Redux ThunkПростая асинхронная логика, не связанная с API-фетчингомНизкаяРабота с асинхронным API браузера, таймауты
Listener MiddlewareРеакция на экшены (аналитика, синхронизация)СредняяЛегковесная альтернатива Саге прямо в RTK
Redux SagaСверхсложные эффекты, отмена запросов по гонке (Race conditions)ВысокаяПоддержка Enterprise-легаси, хардкорные флоу

Частые ошибки при работе с Redux

Разберем коллекцию самых популярных граблей.

  1. Мутация состояния напрямую. В классическом редаксе писать state.value = 1 запрещено, нужно возвращать копию …state. Если вы используете RTK с функцией createSlice, за вас всё сделает библиотеке Immer, но помните: состояние в Redux должно оставаться неизменяемым (иммутабельным).
  2. Хранить в сторе абсолютно всё. Пихать в глобальный стор информацию о том, открыто ли модальное окно или свернуто ли меню — плохая практика. UI-состояние должно жить локально в компоненте через useState.
  3. Грязные редьюсеры. Ваш редьюсер должен быть чистой функцией. Внутри него нельзя делать запросы к API, генерировать Math.random() или обращаться к localStorage. Всё это должно оставаться в экшенах или Thunk.
  4. Забытый Provider. Частая ошибка новичков: стор написали, хук вызвали, а обернуть корневой компонент приложения в <Provider store={store}> забыли. В итоге React выдаст ошибку о том, что контекст не найден.

Частые вопросы о Redux (FAQ)

Что значит редукс?

Если переводить дословно, то Redux можно объяснить как инструмент для «сокращения» или приведения данных к единому знаменателю. Название образовано от функции reduce в JavaScript, так как библиотека построена на редьюсерах — функциях, сводящих множество действий к итоговому состоянию.

Редукс это что — библиотека или фреймворк?

Достаточно взглянуть на его архитектуру. Redux — это легковесная библиотека, а не фреймворк. Она не диктует вам, как строить всё приложение целиком, а лишь предоставляет удобный, строгий и предсказуемый механизм для управления глобальным состоянием ваших данных.

Чем Redux отличается от Context API?

Контекст хорош для редких изменений (тема, язык), но при обновлении он вызывает перерисовку всех вложенных компонентов. Редукс работает точечно: обновляются только те компоненты, которые подписаны на конкретные изменившиеся данные.

Что имеют в виду, когда пишут «знание Redux» в вакансиях?

Когда в вакансиях пишут «Redux», обычно имеют в виду не классический старый подход с кучей бойлерплейта, а современный стек на Redux Toolkit. От кандидата ждут не знание createStore и бесконечных switch/case в редьюсерах, а понимание базовой модели: store → actions → reducers → async logic (Thunk/RTK Query). «Старый» Redux учить не нужно, если только вы не будете поддерживать легаси без миграции.

Нужен ли Redux новичку?

Нет, на старте изучения React он будет только мешать. Прежде чем внедрять глобальное хранилище, вам нужно уверенно овладеть локальным стейтом, жизненным циклом компонентов и хуками. Переходите к нему, когда почувствуете реальную боль от прокидывания пропсов сквозь десятки компонентов.

Коротко о главном

Если ваше приложение разрастается, а данные путаются — вам нужен Редукс. Это стандарт для предсказуемого и прозрачного управления глобальными данными. В 2026 году нет смысла писать портянки шаблонного кода: берите официальный Redux Toolkit (RTK), решайте проблемы асинхронности с помощью встроенных Thunk или RTK Query, и не забивайте глобальное хранилище лишним UI-мусором. Если вы хотите освоить экосистему React, научиться правильно проектировать архитектуру и уверенно работать с глобальным стейтом — обратите внимание на курс «React-разработчик».

Советуем дополнительно почитать по теме:

React и Vue: чем похожи и как отличаются — сравнение двух главных фронтенд-инструментов: синтаксис, экосистема, производительность, рынок и порог входа в 2026 году.

Веб-разработчик: рассказываем подробно о профессии — общий материал про веб-разработку и маршруты входа: фронтенд, React, фулстек, Python, Go и курсы Практикума.

Современный фулстек-разработчик: кто он и что должен уметь — широкая статья про связку фронтенда и бэкенда, React, Node.js, серверную часть и навыки фулстек-разработчика.

10 плагинов для комфортной работы в VS Code — свежая подборка расширений для редактора, которые помогают удобнее писать, проверять и поддерживать код.

ATS отклоняет 75% резюме: как пройти фильтр в 2026 году — полезно тем, кто учит React/Redux и хочет упаковать стек под вакансии: система распознаёт связки вроде React Developer и Frontend Developer.

Бонус для читателей

Хотите прокачать скиллы, чтобы расти в карьере без лишней суеты — берите промокод на курсы Яндекс Практикума

Он даст скидку и превратит инвестиции в себя в выгодную сделку. Бесплатные вводные курсы в Практикуме тоже есть. Стартовать можно в любой момент, карту привязывать не нужно, если что.

Вам может быть интересно
medium