Redux остается одним из самых популярных и надежных инструментов для управления состоянием в больших React- и React Native-приложениях. Однако его начальная настройка может показаться сложной. Это пошаговое руководство проведет вас через процесс установки и базовой настройки современного Redux с использованием рекомендованного инструментария — Redux Toolkit (RTK), который значительно упрощает код и повышает продуктивность.
Прежде всего, убедитесь, что у вас есть работающий проект React или React Native. Для React создайте приложение с помощью Create React App: `npx create-react-app my-app --template redux`. Этот шаблон уже включает предварительно настроенный Redux Toolkit, что является отличным стартом. Для React Native инициализируйте проект через `npx react-native init MyApp`. Для существующих проектов мы будем устанавливать зависимости вручную.
Откройте терминал в корневой директории вашего проекта. Установите необходимые пакеты. Для React-приложения выполните: `npm install @reduxjs/toolkit react-redux`. Для React Native команда будет идентичной. Пакет `@reduxjs/toolkit` (RTK) — это официальный, рекомендуемый подход к написанию логики Redux. Он включает утилиты для настройки хранилища, создания редюсеров и действий, выполнения асинхронной логики и многое другое. Пакет `react-redux` предоставляет React-компоненты и хуки, которые позволяют вашим React-компонентам взаимодействовать с хранилищем Redux.
Теперь создадим структуру папок. Хотя это вопрос предпочтений, рекомендуется структура, ориентированная на функции (feature-based). В папке `src` создайте директорию `app` и `features`. В `app` будет храниться конфигурация хранилища, а в `features` — логика, связанная с конкретными доменами приложения (например, "пользователи", "посты").
Первым делом настроим само хранилище (store). В `src/app` создайте файл `store.js`. Импортируйте `configureStore` из RTK. Эта функция абстрагирует сложную настройку, по умолчанию включая поддержку Redux DevTools и middleware. Создайте и экспортируйте хранилище.
```
import { configureStore } from '@reduxjs/toolkit';
// Импорт редюсеров будет позже
export const store = configureStore({
reducer: {
// Здесь будут добавлены редюсеры из слайсов
},
});
```
Теперь создадим наш первый "слайс" (slice). Слайс — это концепция RTK, которая объединяет логику редюсера и действий для определенной функциональности. В папке `src/features` создайте подпапку, например, `counter` (для демо) или `users`. Внутри создайте файл `counterSlice.js`. Импортируйте `createSlice` и `createAsyncThunk` (если нужна асинхронная логика).
```
import { createSlice } from '@reduxjs/toolkit';
const initialState = {
value: 0,
};
export const counterSlice = createSlice({
name: 'counter',
initialState,
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
incrementByAmount: (state, action) => {
state.value += action.payload;
},
},
});
// Экспортируем сгенерированные actions
export const { increment, decrement, incrementByAmount } = counterSlice.actions;
// Экспортируем редюсер
export default counterSlice.reducer;
```
Обратите внимание: в редюсерах RTK позволяет писать "мутирующую" логику благодаря библиотеке Immer, которая работает "под капотом". Это делает код намного чище.
Вернитесь в `store.js` и импортируйте редюсер из слайса, добавьте его в объект редюсеров.
```
import counterReducer from '../features/counter/counterSlice';
export const store = configureStore({
reducer: {
counter: counterReducer,
},
});
```
Следующий критический шаг — предоставление доступа к хранилищу для всего React-приложения. В корневом файле приложения (обычно `src/index.js` для React или `App.js` для React Native) импортируйте `Provider` из `react-redux` и созданное хранилище. Оберните ваш корневой компонент в `Provider`, передав store как проп.
```
import React from 'react';
import { Provider } from 'react-redux';
import { store } from './app/store';
import App from './App';
function Root() {
return (
);
}
// Для React Native экспортируйте Root
```
Теперь ваше хранилище подключено. Пришло время использовать состояние и действия в компонентах. Вместо устаревшего `connect`, используйте хуки `useSelector` и `useDispatch` из `react-redux`. Создайте простой компонент `Counter.js`.
```
import React from 'react';
import { View, Text, Button } from 'react-native'; // Или div, button для React
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from '../features/counter/counterSlice';
export function Counter() {
const count = useSelector((state) => state.counter.value);
const dispatch = useDispatch();
return (
Count: {count}
dispatch(increment())} />
dispatch(decrement())} />
);
}
```
Хук `useSelector` извлекает нужную часть состояния, а `useDispatch` возвращает функцию для отправки действий. При нажатии кнопки действие отправляется, редюсер обновляет состояние, и компонент автоматически перерисовывается с новым значением.
Для работы с асинхронными операциями (запросы к API) используйте `createAsyncThunk`. Внутри слайса определите thunk, который будет выполнять асинхронную логику, а затем обработайте его жизненный цикл (pending, fulfilled, rejected) в `extraReducers`. Это стандартный и эффективный подход для загрузки данных.
Наконец, установите расширение Redux DevTools для браузера (Chrome или Firefox). Благодаря настройкам `configureStore`, оно будет работать автоматически. Вы сможете инспектировать состояние, отслеживать действия и даже "путешествовать во времени" для отладки — это незаменимый инструмент для разработки.
Следуя этим шагам, вы установите и настроите современный Redux (Redux Toolkit) в своем проекте. Этот подход минимизирует шаблонный код, обеспечивает лучшие практики из коробки и создает отличную основу для роста вашего приложения.
Как установить Redux для разработки: Полное руководство по настройке современного стейт-менеджмента
Пошаговое руководство по установке и настройке Redux Toolkit (RTK) и React Redux в React или React Native приложении. Описывается создание хранилища, слайсов, подключение провайдера и использование хуков для управления состоянием.
231
4
Комментарии (9)