Redux
Redux на примере игры Ханойские Башни
https://gitlab.in6k.com/meetup/tower-of-hanoi
💻 Использовать react-redux в todo-list-app#
State#
Глобальное состояние может иметь следующий вид:
Статистика открытых задач вынесена в отдельную ветку openedTasks для простого обновления. Ключ - id списка. Значение - количество открытых задач в списке.
Ветка tasks сделана в виде объекта для кеширования задач из списка. После последующих открытий списка задачи сразу будут браться из кеша и потом обновляться данными с сервера.
Структура папок и reducer#
Структура папок повторяет основные ветки состояния. Так, reducer и actions относящиеся к ветке состояния dashboard находятся в одноименной папке.
Для удобства обновления состояния выделяются редьюсеры для работы с одной конкретной веткой и сливаются потом в один комбинированный редьюсер функцией combineReducers. Результатом работы такого редьюсера всегда будет объект.
В store/index.js файле combineReducers используется для создание корневого редьюсера на основе редьюсеров веток первого уровня.
Асинхронные actions#
Редьюсеры по своей природе синхронные функции без побочных эффектов. В чистом redux action - это объект с полем type и другими полями с данными. Для выполнения асинхронных действий используется библиотека redux-thunk. Она добавляет в store промежуточный слой (middleware) для перехвата действий типа Function. Если в store в отправить не объект а функцию, то ее перехватит redux-thunk и вызовет, передав ссылку на функцию dispatch уже следующего middleware (или чистого store, если других middleware нет).
Вот как может выглядеть действие загрузки дeшборда.
В примере выше мы используем принятое в redux свойство payload для обозначения полезной нагрузки (данных) действия. Свойство это может называться и иначе и быть не единственным свойством с данными. Тут уже как решат разработчики в команде.
Подключение redux-thunk#
Что бы redux начал "понимать" action-ы с типом Function, thunk middleware необходимо внедрить в store.
middleware + Redux DevTool#
При использовании сразу нескольких расширений store (middleware, Redux DevTool) код будет немного сложнее.
Redux DevTool
Описание разных вариантов подключения Redux DevTool по ссылке https://github.com/zalmoxisus/redux-devtools-extension#12-advanced-store-setup
Действия с параметрами#
Часто наши асинхронные действия нуждаются в дополнительных параметрах. К примеру, для получения задач списка надо указать id списка. Для такого действия нам понадобиться функция обертка, вызвав которую мы получим асинхронное действие с "встроенным" параметром.
Смотрите также: