Я собираюсь мигрировать в Redux.
Мое приложение состоит из множества частей (страниц, компонентов), поэтому я хочу создать множество редукторов. Примеры Redux показывают, что я должен использовать combineReducers()
для создания одного редуктора.
Также, насколько я понимаю, приложение Redux должно иметь одно хранилище, и оно создается после запуска приложения. Когда магазин создается, я должен передать свой комбинированный редуктор. Это имеет смысл, если приложение не слишком большое.
Но что если я соберу более одного комплекта JavaScript? Например, каждая страница приложения имеет свой пакет. Я думаю, что в этом случае один комбинированный редуктор не годится. Я просмотрел источники Redux и нашел replaceReducer()
функцию. Кажется, это то, что я хочу.
Я мог бы создать комбинированный редуктор для каждой части моего приложения и использовать replaceReducer()
при перемещении между частями приложения.
Это хороший подход?
источник
/homepage
а затем загружается большая часть этой ветки, когда пользователь переходит к ихprofile.
примеру. Пример того, как сделать это, было бы здорово. В противном случае мне будет трудно выровнять свое дерево состояний, или у меня будут очень специфические имена ветвейuser-permissions
иuser-personal
Вот как я реализовал это в текущем приложении (на основе кода Дэна из выпуска GitHub!)
Создайте экземпляр реестра при загрузке вашего приложения, передавая редукторы, которые будут включены в пакет ввода:
Затем при настройке хранилища и маршрутов используйте функцию, которую вы можете передать реестру редуктора:
Где эти функции выглядят примерно так:
Вот основной живой пример, который был создан с этой настройкой, и его источник:
Он также охватывает необходимую конфигурацию, чтобы включить горячую перезагрузку для всех ваших редукторов.
источник
Теперь есть модуль, который добавляет инъекционные редукторы в хранилище редуксов. Это называется Redux Injector .
Вот как это использовать:
Не комбинируйте редукторы. Вместо этого поместите их в (вложенный) объект функций, как обычно, но без их объединения.
Используйте createInjectStore из redux-инжектора вместо createStore из redux.
Введите новые редукторы с помощью injectReducer.
Вот пример:
Полное раскрытие: я создатель модуля.
источник
По состоянию на октябрь 2017 года:
Reedux
реализует то, что предложил Дэн и ничего более, не затрагивая ваш магазин, ваш проект или ваши привычки
Существуют и другие библиотеки, но они могут иметь слишком много зависимостей, меньше примеров, сложное использование, несовместимы с некоторыми промежуточными программами или могут потребовать переписать управление состоянием. Скопировано со вступительной страницы Reedux:
источник
Мы выпустили новую библиотеку, которая помогает модулировать приложение Redux и позволяет динамически добавлять / удалять Редукторы и промежуточное ПО.
Пожалуйста, посмотрите на https://github.com/Microsoft/redux-dynamic-modules
Модули обеспечивают следующие преимущества:
Модули можно легко повторно использовать в приложении или между несколькими аналогичными приложениями.
Компоненты объявляют необходимые им модули, а redux-dynamic-modules гарантирует, что модуль загружен для компонента.
Характеристики
Примеры сценариев
источник
Вот еще один пример с разделением кода и избыточными магазинами, довольно простой и элегантный на мой взгляд. Я думаю, что это может быть весьма полезно для тех, кто ищет рабочее решение.
Это хранилище немного упрощено, оно не заставляет вас иметь пространство имен (reducer.name) в вашем объекте состояния, конечно, может быть конфликт с именами, но вы можете контролировать это, создавая соглашение об именах для ваших редукторов, и это все должно быть в порядке.
источник