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

1. Организуйте свои файлы по функциям

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

Например, если у вас есть функция под названием «пользователи», у вас будет такая структура каталогов:

- src
  - features
    - users
      - UsersComponent.jsx
      - usersSlice.js
      - UsersAPI.js
      - UsersTests.js

В папке «users» у вас есть все, что связано с функцией «users», включая ее компоненты React, фрагменты Redux, вызовы API и тесты.

2. Используйте Redux Toolkit createSlice и createAsyncThunk

По мере роста вашего приложения управление типами действий, создателями действий и преобразователями может стать утомительным. Функции createSlice и createAsyncThunk Redux Toolkit помогают уменьшить этот шаблон и упростить управление кодом.

Вот пример с функцией «книги»:

// src/features/books/booksSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import { fetchBooks } from './BooksAPI';

// An async thunk action to fetch books
export const fetchBooksThunk = createAsyncThunk('books/fetchBooks', fetchBooks);

const booksSlice = createSlice({
  name: 'books',
  initialState: { entities: [], loading: 'idle' },
  reducers: {},
  extraReducers: (builder) => {
    builder.addCase(fetchBooksThunk.fulfilled, (state, action) => {
      state.entities = action.payload;
      state.loading = 'idle';
    });
    builder.addCase(fetchBooksThunk.pending, (state, action) => {
      state.loading = 'loading';
    });
    builder.addCase(fetchBooksThunk.rejected, (state, action) => {
      state.loading = 'idle';
    });
  },
});

export default booksSlice.reducer;

В этом примере мы создаем срез для функции «книги». Мы используем createAsyncThunk Redux Toolkit для обработки выборки книг. Действие fetchBooksThunk обрабатывает различные этапы асинхронного запроса (ожидание, выполнение, отклонение), и наш редюсер отвечает соответствующим образом.

3. Нормализуйте форму своего состояния

Работая с большими объемами данных, вы можете столкнуться с такими проблемами, как дублирование данных и несогласованность. Нормализация формы вашего состояния может помочь решить эти проблемы.

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

Вот пример:

// Non-normalized state
{
  posts: [{
    id: 1,
    title: 'Post 1',
    author: {
      id: 1,
      name: 'Author 1'
    }
  }, {
    id: 2,
    title: 'Post 2',
    author: {
      id: 1,
      name: 'Author 1'
    }
  }]
}

// Normalized state
{
  posts: {
    byId: {
      1: { id: 1, title: 'Post 1', authorId: 1 },
      2: { id: 2, title: 'Post 2', authorId: 1 },
    },
    allIds: [1, 2]
  },
  authors: {
    byId: {
      1: { id: 1, name: 'Author 1' },
    },
    allIds: [1]
  }
}

В нормализованном состоянии сообщения и авторы разделены на свои собственные «таблицы», а сообщения ссылаются на авторов по их идентификаторам. Эта структура устраняет избыточность и упрощает обновление отдельных сообщений или авторов.

Помните, что это всего лишь рекомендации, которые помогут вам структурировать ваш магазин Redux в больших приложениях. В зависимости от предпочтений вашей команды и вашего конкретного варианта использования вы можете выбрать другой подход. Главное, чтобы ваш магазин Redux оставался управляемым, масштабируемым и простым для понимания. Оставайтесь с нами, чтобы узнать больше о работе с Redux в крупномасштабных приложениях! Удачного кодирования!

Если вам понравилась статья и вы хотите выразить свою поддержку, сделайте следующее:

👏 Аплодируйте истории (50 аплодисментов), чтобы эта статья попала в топ

👉Подпишитесь на меня в Среднем

Посмотрите больше контента в моем профиле Medium