Я бы хотел, чтобы мой SPA, основанный на React, отображался на стороне сервера (кто не в эти дни). Поэтому я хочу совместить React с react-router, redux и некоторым слоем сборки, например isomorphic starterkit.Как логически комбинировать реактивный маршрутизатор и редукцию для рендеринга на стороне клиента и на стороне сервера
Существует hapi universal redux, который объединяется вместе, но я борюсь с тем, как организовать мой поток. Мои данные поступают из нескольких конечных точек API REST. Различные компоненты имеют разные потребности в данных и должны загружать данные как раз на клиенте. Вместо этого на сервере должны быть получены все данные для определенного маршрута (набор компонентов) и необходимые компоненты, переданные в строки.
В моем первом подходе я использовал промежуточное ПО редукса для создания асинхронных действий, которые загружают данные, возвращают обещание и запускают действие SOME_DATA_ARRIVED
, когда обетование разрешается. Редукторы затем обновляют мой магазин, переделывают компоненты, все хорошо. В принципе, это работает. Но потом я понял, что поток становится неудобным, и в этот момент вступает в игру маршрутизация.
В некотором компоненте, который перечисляет несколько записей данных, имеется несколько ссылок для фильтрации записей. Каждый фильтрованный набор данных должен быть доступен через собственный URL-адрес, например /filter-by/:filter
. Поэтому я использую разные компоненты <Link to={...}>
для изменения URL-адреса при нажатии и запуска маршрутизатора. Маршрутизатор должен обновить хранилище, затем в соответствии с состоянием, представленным текущим URL-адресом, что, в свою очередь, вызывает повторную визуализацию соответствующего компонента.
Это нелегко достичь. Сначала я попробовал componentWillUpdate
, чтобы вызвать действие, которое асинхронно загрузило мои данные, заполнило хранилище и вызвало другой цикл повторного рендеринга для моего компонента. Но это не работает на сервере, так как поддерживаются только 3 метода жизненного цикла.
Так что я ищу правильный способ организовать это. Пользовательские взаимодействия с приложением, которые изменяют состояние приложений с точки зрения пользователей, должны обновлять URL-адрес. IMO это должно заставить маршрутизатор каким-то образом загружать необходимые данные, обновлять хранилище и запускать процесс согласования.
So interaction -> URL change -> data fetching -> store update -> re-render
.
Этот подход также должен работать на сервере, поскольку из запрошенного URL-адреса необходимо определить загружаемые данные, сгенерировать initial state
и передать это состояние в генератор редукции store
. Но я не нахожу способ правильно это сделать. Поэтому для меня возникают следующие вопросы:
- Является ли мой подход неправильным, потому что есть что-то, чего я еще не понимаю/не знаю?
- Правильно ли хранить данные, загруженные из API REST в ?
- Не слишком ли неудобно иметь компоненты, которые поддерживают
state
в редукцииstore
и другие, управляющие своимиstate
самими собой? - Идея иметь
interaction -> URL change -> data fetching -> store update -> re-render
просто неправильно?
Я открыт для всех предложений.