Как структурировать Redux для сильно развязанного сложного компонента plug-n-play?

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

Сведения о приложении: SPA с AngularJS. Другие библиотеки использовали ng-redux, reselect, rxjs.

Сведения о компоненте. Многоразовый компонент сетки для визуализации огромных объемов данных.

Моя идея: создать архитектуру на основе компонентов типа plug-n-play, в которой все внутренние компоненты сетки не зависят от родительского/составного компонента, такого как поиск, сортировка, строка, заголовок, ячейка. .

  1. Все компоненты будут иметь собственный набор редюсеров, действий, селекторов и срезов состояний из хранилища.

  2. Поскольку все компоненты имеют свои редьюсеры и могут быть подключены по требованию, мне нужно, чтобы они лениво регистрировались в хранилище, а не накапливались в одном месте.

  3. Некоторые компоненты, такие как поиск, сортировка, имеют собственное состояние и могут влиять на состояние других компонентов. Пример: настройка параметров запроса (searchText, sortOrder и т. д.) для получения данных сетки, которые будут обрабатываться другим компонентом (компонентами).

Мои мысли:

  1. Во-первых, я изучаю reselect для предоставления зависимого фрагмента состояния.

  2. Что касается второго пункта, я все еще не понимаю, что использовать combineReducers/replaceReducer для отложенной регистрации. Я чувствую, что combineReducers не подойдет, если мне нужен доступ к нескольким частям состояния.

  3. Что касается третьего пункта, я думаю о следующих подходах:

    а. Передача всего состояния через getState() везде, где требуется обновить несколько частей состояния. Хотя такой подход вызывает у меня ощущение неправильного использования Redux.

    б. Компонент A запускает свое собственное действие, которое обновляет его часть состояния, затем запускается другое действие для другого компонента B, чтобы обновить свою часть состояния. Этот подход также кажется нарушением всей идеи Redux, здесь можно использовать концепцию побочного эффекта, хотя я не знаю, как ее использовать, возможно, redux-saga, redux-thunk и т. д.

ПРИМЕЧАНИЕ. Использование любого из подходов не должно приводить к тому, что компонент узнает о других компонентах, поэтому все, что нужно сделать, будет сделано путем передачи общего объекта конфигурации, такого как { actionsToFire: ['UPDATE_B'] }.

  1. Мне нужно управление состоянием при переходе между страницами приложения, но мне не требуется горячая перезагрузка, повтор действий или предварительная выборка состояния приложения со стороны сервера.

  2. Компоненты также будут нести ответственность за уничтожение своего состояния, когда оно больше не требуется. И состояние будет иметь нормализованную структуру.

Я знаю, что требования могут показаться странными или редко встречающимися, но я бы оставил их такими.

Я уже знаю несколько вещей:

  1. Мне не нужно использовать Redux, как говорится в классической статье Дэна, но я думаю, что в данном случае он мне нужен.

  2. Я знаю о компонентах Smart и Dumb, в основном мои компоненты могут показаться умными (т.е. осведомленными о состоянии приложения), но именно так я хочу их сохранить, я могу ошибаться.

Схема компонента сетки:

Схема компонентов сетки


person Sachin Nair    schedule 29.10.2017    source источник
comment
Если у вас было несколько экземпляров одного и того же класса компонентов, вам нужен способ идентифицировать их в глобальном состоянии (например, с помощью идентификатора). я не знаю, учли ли вы это в своем дизайне   -  person strider    schedule 30.10.2017
comment
@bitstrider да, я продумал это, я буду использовать пространства имен или идентификаторы везде, где это необходимо.   -  person Sachin Nair    schedule 31.10.2017


Ответы (1)


Глобальное хранилище Redux усложняет инкапсуляцию и динамическое поведение plug-and-play, но это возможно. На самом деле существует много существующих библиотек для состояния каждого компонента-экземпляра. и динамическая регистрация редукторы. (Тем не менее, библиотеки, которые я видел до сих пор для управления компонентами, — это библиотеки React — вам придется изучить некоторые из них и самостоятельно реализовать что-то для использования с Angular.)

person markerikson    schedule 29.10.2017