Я создаю одно приложение, которое будет выполнять SSR (рендеринг на стороне сервера), и я использую React + Redux .
Я только что начал реализовывать Redux в этом приложении. Ранее это было приложение, использующее только React useState
, useContext
et c.
Дело в том, что иногда мне нужно, чтобы код моего приложения знал о среде, в которой он работает, либо ON_CLIENT
или ON_SERVER
, например, чтобы пропустить какой-то оператор window.something
.
До Redux я делал следующее:
index. js (это может быть индекс. js моего клиентского пакета или моего сервера)
ReactDOM.render(
<App
ON_SERVER={false} // THIS IS TRUE ON SERVER CODE
ON_CLIENT={true} // THIS IS TRUE ON CLIENT CODE
... other stuff
/>
,document.getElementById('root')
);
Приложение. js
...
const environment = {
ON_SERVER: props.ON_SERVER,
ON_CLIENT: props.ON_CLIENT
}
...
// PROVIDING IT USING REACT CONTEXT
return (
<EnvironmentContext.Provider value={environment}>
<MyComponents/>
</EnvironmentContext.Provider>
);
И затем, внутри некоторого компонента, я могу сделать этот шаблон:
SomeComponent. js
const {ON_CLIENT} = useContext(EnvironmentContext);
ON_CLIENT && window.something;
И я хочу улучшить этот шаблон с помощью Redux .
Я хочу сохранить это в магазине Redux, чтобы я мог избавиться от EnvironmentContext
и получить к нему доступ с помощью:
const {ON_CLIENT} = useSelector((state) => state.environment);
Так что я мы думали сделать:
index. js
const store = createStore(rootReducer, {
environment: {
ON_CLIENT: true, // THIS IS TRUE ON CLIENT CODE
ON_SERVER: false // THIS IS TRUE ON SERVER CODE
}
});
Но так как у меня нет соответствующего редуктора для этой части состояния (environment
) Я получил сообщение об ошибке:
ред. x. js: 319 В аргументе preloadedState передан неожиданный ключ "environment", переданный в createStore. Вместо этого ожидается поиск одного из известных ключей редуктора: "auth", "appVersion", "siteData". Неожиданные ключи будут игнорироваться.
ПРИМЕЧАНИЕ: auth
, appVersion
и siteData
являются частями состояния, для которых у меня есть соответствующие редукторы.
Вот my rootReducer
:
const rootReducer = combineReducers({
auth: updateAuth,
appVersion: updateClientVersion,
siteData: updateSiteData
});
ВОПРОС
Могу ли я иметь некоторую часть состояния, которая не изменится и, следовательно, не будет обработана каким-либо редуктором? Или в этом случае мне нужно установить какой-нибудь фиктивный редуктор, чтобы всегда возвращать одно и то же состояние? PS: Это делает трюк, но кажется, что это неправильно.
// NOTE: I will always preload this state, in the `createStore` call, so the state will never be undefined.
function returnEnvironment(state={}, action) {
return state;
}
const rootReducer = combineReducers({
auth: updateAuth,
appVersion: updateClientVersion,
siteData: updateSiteData,
environment: returnEnvironment
});
У кого-нибудь есть лучшая альтернатива этому?
Я смотрел на это обсуждение: https://github.com/reduxjs/redux/issues/1457
Есть несколько предложений по заполнению глобального объекта, но я бы предпочел оставить все это внутри React
и Redux
.
PS: Извините за длинный вопрос, но я хотел, чтобы мой пример использования был как можно более понятным, чтобы у кого-то был лучший образец.