Redux — это библиотека для предсказуемого управления состоянием
приложений на JavaScript, часто используемая вместе с React и Chakra UI
для построения масштабируемых интерфейсов. Основной принцип Redux
заключается в едином источнике правды — глобальном
хранилище (store), которое содержит все состояние
приложения. Изменения состояния происходят только через действия
(actions) и редьюсеры
(reducers), обеспечивая предсказуемость и
прозрачность изменений.
Ключевые элементы Redux:
createStore или современных
инструментов configureStore из Redux Toolkit.type, описывающие событие, которое должно изменить
состояние.Для интеграции Redux с React используется библиотека
react-redux. Основные шаги:
store) с помощью
configureStore..useSelector для чтения состояния и
useDispatch для отправки действий.Пример:
import { configureStore } from '@reduxjs/toolkit';
import { Provider, useDispatch, useSelector } from 'react-redux';
import counterReducer from './counterSlice';
const store = configureStore({
reducer: {
counter: counterReducer,
},
});
function App() {
return (
);
}
function Counter() {
const count = useSelector((state) => state.counter.value);
const dispatch = useDispatch();
return (
{count}
);
}
Redux Toolkit позволяет сократить количество шаблонного кода,
используя slice — объединение reducers и
actions в одном месте.
Пример slice для счетчика:
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; },
reset: (state) => { state.value = 0; },
},
});
export const { increment, decrement, reset } = counterSlice.actions;
export default counterSlice.reducer;
Chakra UI предоставляет обширный набор компонентов, взаимодействующих с состоянием. Использование Redux позволяет управлять состоянием этих компонентов централизованно:
Modal) – состояние
открытия/закрытия можно хранить в Redux.Tabs) – активный индекс можно
синхронизировать с Redux для управления глобальными переходами.ColorMode) – можно
использовать Redux для сохранения выбора темы между страницами.Пример управления модальным окном:
import { Modal, ModalOverlay, ModalContent, Button } from '@chakra-ui/react';
import { useSelector, useDispatch } from 'react-redux';
import { openModal, closeModal } from './modalSlice';
function CustomModal() {
const isOpen = useSelector((state) => state.modal.isOpen);
const dispatch = useDispatch();
return (
<>
dispatch(closeModal())}>
Содержимое модального окна
>
);
}
Для взаимодействия с внешними API используются асинхронные
действия (thunks). Они позволяют выполнять запросы
и обновлять состояние после получения данных.
Пример асинхронного запроса:
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
export const fetchUsers = createAsyncThunk(
'users/fetchUsers',
async () => {
const response = await fetch('https://jsonplaceholder.typicode.com/users');
return response.json();
}
);
const usersSlice = createSlice({
name: 'users',
initialState: { list: [], status: 'idle' },
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchUsers.pending, (state) => { state.status = 'loading'; })
.addCase(fetchUsers.fulfilled, (state, action) => {
state.status = 'succeeded';
state.list = action.payload;
})
.addCase(fetchUsers.rejected, (state) => { state.status = 'failed'; });
},
});
export default usersSlice.reducer;
Комбинация Chakra UI и Redux позволяет создавать интерактивные интерфейсы с предсказуемым поведением:
useState) используются только для
временных, изолированных данных.Например, табы, модальные окна, уведомления (Toast) и
элементы формы можно централизованно контролировать через Redux,
синхронизируя UI и данные без дублирования логики.