Во-первых, краткий обзор того, что такое редукторы в Redux:

Редукторы - это не что иное, как чистые функции, которые принимают предыдущее состояние и действие и возвращают новое состояние.

Следует помнить о двух вещах: они чистые и, следовательно, не изменяют состояние.

Разобравшись с этим, давайте перейдем к делу.

Когда мы начинаем с redux, мы пишем редуктор следующим образом:

У нас есть редуктор поиска, который обновляет состояние на основе различных действий, таких как настройка результатов поиска, обновление строки поиска или изменение состояния загрузчика / счетчика. Предположим, это редуктор срезов, который мы можем объединить позже с помощью функции combineReducers(reducers).

Теперь, если вы похожи на меня, вам могут не понравиться операторы переключения 😋

У них слишком много собственных шаблонов. Редуктор, обрабатывающий многие типы действий с использованием вариантов переключения, будет долгим. А сейчас это было бы нехорошо, не так ли ?! Идея состоит в том, чтобы отказаться от переключателя и перейти к более функциональному подходу.

Давайте немного обдумаем это

Что мы можем сделать, так это абстрагировать всю нашу логику переключения case в «функции case» и создать объект, который сопоставляет типы действий с соответствующими функциями case. Назовем этот объект «actionHandlers».
Ниже представлен объект:

Как видите, теперь у нас есть отображение типов действий на функции case.

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

Теперь мы должны создать функцию «reducer creator», чтобы использовать наш actionHandlers. Эта функция вернет другую функцию, которая на самом деле будет нашим редуктором, переданным в combineReducers(). Вот:

Как видите, createReducer() - это замыкание, возвращающее другую функцию. Эта возвращенная функция соответствует форме (previousState, action) => newState и, следовательно, будет нашим фактическим редуктором фрагментов.

Возвращенная функция-редуктор может получить доступ как к actionHandlers, так и initialState аргументам включающей функции из-за закрытия. initialState используется как аргумент по умолчанию для state. Внутри функции reducer мы проверяем, есть ли у нашего actionHandlers свойство, соответствующее типу входящего действия. Если это так, мы выполняем эту функцию case внутри actionHandlers, передавая состояние и действие. Если тип действия не является свойством внутри actionHandlers, мы возвращаем предыдущее состояние.

Вы также можете найти createReducer() в официальных документах Redux.

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

Вышеупомянутая функция сейчас является многословной для объяснения точки зрения. Давайте немного оживим! Ниже представлен новый и улучшенный файл редуктора создания. 😎

Я сократил все, используя лямбды и функцию propOr библиотеки Ramda. Функция propOr берет второй аргумент (ключ) для проверки внутри третьего аргумента (объекта) и возвращает его значение, если оно найдено. В противном случае он возвращает значение по умолчанию, полученное из 1-го аргумента. Первый аргумент, identity, - это функция, которая просто возвращает переданный ей параметр.

Таким образом, функция возвращается, если она находится в actionHandlers, которая выполняется с использованием (state, action. Если действие не найдено, propOr возвращает идентификатор, который выполняется с теми же аргументами (state, action) и возвращает первый предоставленный аргумент, которым является state (предыдущее состояние в данном случае).

Вы можете создавать свои собственные функции «propOr» и «identity», Ramda - это именно то, что я использую.

Позвольте мне показать вам новый файл сокращения поиска, чтобы получить общее представление о том, как мы используем нашу createReducer функцию с actionHandlers.

Функция createReducer применяется частично и возвращает наш последний редуктор среза и экспортируется в файл, где мы используем функцию combineReducers.

Что ж, вот и хороший способ создания редукторов и сокращения общего шаблона. Надеюсь, это принесет вам какую-то пользу :)

Вот несколько ссылок на мои предыдущие статьи:





Мир ✌️