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

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

  1. Для большинства асинхронных действий состояние будет иметь следующую информацию: a) данные: которые будут использоваться компонентами
    b) загрузка: флаг, указывающий, выполнен ли вызов api или нет.
    c) Необязательно: объект ошибки, содержащий ответ на ошибку, флаги неудачи и успеха.
    Таким образом, большинство редукторов будут иметь повторяющийся код для обновления состояния, который может быть оптимизирован в соответствии с принципом кода DRY (Don't Repeat Yourself ).
  2. Для вызова API мы должны вручную отправлять действия с полезной нагрузкой для каждого асинхронного состояния.

Из этих двух наблюдений очевидно, что это необходимо.

  1. Упростите настройку редуктора и создайте единственную функцию, которая будет генерировать редуктор на основе передаваемого ему actionType.
  2. Автоматизируйте отправку действий на основе асинхронного состояния (Подсказка: промежуточное ПО Redux Promise).

Упрощение настройки редуктора.

Нам нужно создать функцию, которая генерирует reducer на основе переданного ей actionType.

Функция createReducer выполнит изменение состояния, связанное с определенным действием.

Функция createThunkReducer - это то, что генерирует редуктор для асинхронного действия, и на первый взгляд это может показаться некоторым загадочным, но я не уверяю вас. Подумайте об этом как об объекте, содержащем функции с динамическими именами. Вы можете проверить эту ссылку для лучшего понимания.
Итак, давайте посмотрим, как это выглядит при использовании в корневом редукторе.

Эта единственная функция избавила нас от необходимости создавать дополнительные файлы или код для каждого действия.

Примечание. Если вы когда-нибудь столкнетесь со сценарием добавления ваших собственных конкретных редукторов, мы можем передать обработчики действий в качестве дополнительных параметров в createThunkReducer.

Упростите отправку действий с помощью ПО промежуточного слоя Redux Promise.

Промежуточное ПО Redux для обещаний проверяет, является ли отправляемая полезная нагрузка действия обещанием, и, если да, преобразует действие и добавляет _PENDING, _FULFILLED или _REJECTED к имени действия на основе состояния обещания до того, как оно достигнет редуктора, и это именно то, что нам нужно, так как оно освобождает нас от необходимости писать диспетчерские функции для каждого асинхронного состояния.

Это конфигурация хранилища для добавления промежуточного программного обеспечения redux Promise и redux thunk.

Таким образом, промежуточное ПО redux Promise проверяет отправляемую ему полезную нагрузку, выполняет преобразования действия и отправляет его редуктору, где он выполняет обновление хранилища.

Ссылки:
https://www.digitalocean.com/community/tutorials/redux-redux-thunk