Я использую рендеринг на стороне сервера для своего приложения React-Redux. И я хочу, чтобы при запуске приложения загружались некоторые константы, например список городов с соответствующими идентификаторами:
[
{
name: "London",
id: 1
}
...
]
Я думаю, что лучше поместить эти данные в store
на стороне сервера и предоставить их клиенту с помощью window.__INITIAL_STATE__
, как предлагается здесь http://redux.js.org/docs/recipes/ServerRendering.html
Эти константы будут доступны только для чтения, и я хочу предварительно загрузить их только для целей нормализации данных. Например, позже я могу просто получить список пользователей с идентификаторами городов вместо пользователей с названиями городов: {name: "Alex", cities: [1,2]}
Проблема в том, что если я помещаю их в хранилище, то я вынужден создать редьюсер для этих констант, иначе я получаю эту ошибку:
В аргументе preloadedState, переданном в createStore, обнаружен неожиданный ключ «города». Ожидается, что вместо этого будет найден один из известных ключей редуктора: «цвета». Неожиданные ключи будут игнорироваться.
Поэтому я ищу какой-нибудь элегантный способ справиться с этой ситуацией.
На данный момент у меня есть 2 идеи, как с этим справиться:
Создайте пустой редуктор, который всегда будет возвращать состояние по умолчанию.
export const cities = (state = [], action={ type: null }) => { return state }
Отправлять с сервера начальные действия с полезными данными и выполнять их на клиенте при запуске:
// server.js window.INITIAL_ACTIONS = [ { type: "REQUEST_LOGIN_SUCCESS", user: {userId, userName, userEmail, etc} }, { type: "REQUEST_CITIES_SUCCESS", [..listOfCities] }, ]
И в моем client-index.js
отправьте эти действия сразу после создания магазина:
//client-index.js
window.INITIAL_ACTIONS.forEach(store.dispatch)
Итак, хорош ли один из моих подходов? Или, может быть, вы знаете какое-то другое, более элегантное решение?
Спасибо.