Основные различия
1. Предназначение
- Context API: Решение проблемы пропс дриллинга (prop drilling) для передачи данных через дерево компонентов
- Redux: Полноценная система управления состоянием (state management) для сложных приложений
2. Встроенность в React
- Context API: Встроен в React (не требует дополнительных зависимостей)
- Redux: Внешняя библиотека (требует установки
redux
и react-redux
)
Архитектурные различия
1. Модель данных
// Context API (простая передача значения)
<ThemeContext.Provider value={theme}>
// Redux (единое хранилище с редьюсерами)
const store = createStore(rootReducer)
2. Обновление состояния
- Context API:
- Обновляется через обычный setState/useReducer
- Нет стандартного паттерна для обновлений
- Redux:
- Строгая система: action -> reducer -> new state
- Единый способ обновления через dispatch
3. Структура кода
- Context API:
- Гибкая структура (разработчик сам определяет организацию)
- Redux:
- Четкое разделение на actions, reducers, store
- Стандартные паттерны (Ducks, Feature-based)
Производительность
1. Механизм обновлений
- Context API:
- Все потребители контекста перерендериваются при изменении значения
- Нет встроенной мемоизации
- Redux:
- Подключенные компоненты перерендериваются только когда изменяются конкретные части состояния
- Оптимизации через
connect
или useSelector
2. Мемоизация
// Context API (ручная оптимизация)
const value = useMemo(() => ({ theme, setTheme }), [theme])
// Redux (автоматическая в connect)
connect(mapStateToProps)(Component)
Экосистема
1. DevTools
- Context API: Нет встроенных инструментов отладки
- Redux: Полноценные Redux DevTools (time travel, action history)
2. Middleware
- Context API: Нет поддержки middleware
- Redux: Поддержка middleware (логгер, саги, thunk)
3. Дополнительные возможности
- Redux:
- Redux Thunk/Redux Saga для сайд-эффектов
- Redux Persist для сохранения состояния
- Reselect для мемоизированных селекторов
Сложность обучения
Критерий |
Context API |
Redux |
Базовое использование |
Простое |
Среднее |
Продвинутые сценарии |
Сложно |
Четкие стандарты |
Документация |
В документации React |
Отдельная обширная документация |
Когда что использовать
Context API лучше подходит для:
- Темы оформления (theme)
- Локализации (i18n)
- Данных аутентификации
- Простых приложений без сложного состояния
Redux предпочтительнее для:
- Приложений с сложной бизнес-логикой
- Когда нужно время отладки (time travel)
- Больших команд (стандартизация кода)
- Частых обновлений состояния
Примеры кода
Context API реализация
const UserContext = createContext();
function App() {
const [user, setUser] = useState(null);
return (
<UserContext.Provider value={{ user, setUser }}>
<Profile />
</UserContext.Provider>
);
}
function Profile() {
const { user } = useContext(UserContext);
return <div>{user?.name}</div>;
}
Redux реализация
// store.js
const store = createStore(userReducer);
// actions.js
const setUser = (user) => ({ type: 'SET_USER', payload: user });
// Profile.js
const Profile = () => {
const user = useSelector(state => state.user);
return <div>{user?.name}</div>;
}
Современные тенденции
- Redux Toolkit: Упрощает работу с Redux (уменьшает boilerplate)
const userSlice = createSlice({
name: 'user',
initialState: null,
reducers: {
setUser: (state, action) => action.payload
}
});
- Комбинированный подход: Использование Context API для локального состояния и Redux для глобального
Резюмируем
- Context API — это встроенный механизм передачи данных, Redux — полноценное решение для управления состоянием
- Производительность: Redux предлагает больше оптимизаций для сложных приложений
- Инструменты: Redux имеет богатую экосистему и DevTools
- Сложность: Context API проще освоить, но сложнее масштабировать
- Современный React: Для новых проектов рассматривайте Redux Toolkit как улучшенную версию Redux
Выбор зависит от масштаба проекта: для небольших приложений Context API часто достаточно, для сложных — Redux остается стандартом.