我正在构建一个将执行SSR(服务器端渲染)的单一应用程序,我正在使用React+Redux。
我刚刚开始在这个应用程序中实现Redux。它是以前只使用React的useState
,useContext
等构建的应用程序。
事实上,有时候我需要我的应用程序代码知道它运行的环境,例如ON_CLIENT
或ON_SERVER
,以跳过一些window.something
语句。
在Redux之前,我正在执行以下操作:
index.js(这可能是我的客户端软件包或服务器软件包的index.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>
);
然后,在一些组件中,我可以这样做:
某个组件.js
const {ON_CLIENT} = useContext(EnvironmentContext);
ON_CLIENT && window.something;
我想用Redux改进这个模式。
我想把它保存在Redux商店中,这样我就可以摆脱EnvironmentContext
,并使用以下命令访问它:
const {ON_CLIENT} = useSelector((state) => state.environment);
所以我想到了做:
索引.js
const store = createStore(rootReducer, {
environment: {
ON_CLIENT: true, // THIS IS TRUE ON CLIENT CODE
ON_SERVER: false // THIS IS TRUE ON SERVER CODE
}
});
但由于我没有相应的reducer用于这一状态(environment
),我得到了这个错误消息:
- redux.js:319**在传递给createStore的preloadedState参数中找到意外的键“environment”。*应找到一个已知的reducer键:“auth”、“appVersion”、“siteData”。将忽略意外的键。
注意:auth
、appVersion
和siteData
是我有相应的归约器的状态片段。
下面是我的rootReducer
:
const rootReducer = combineReducers({
auth: updateAuth,
appVersion: updateClientVersion,
siteData: updateSiteData
});
问题
我能不能有一些不会改变的状态,因此不被任何reducer处理?或者在这种情况下,我确实需要设置一些虚拟reducer,只是为了总是返回相同的状态?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:**抱歉问了这么长的问题,但我想让我的用例尽可能清楚,这样可能有人会有更好的模式。
1条答案
按热度按时间mwecs4sa1#
Redux是为数据集中和管理而设计的,比如加载一些动态数据,在应用程序的生存期内对其进行更改等等。由于您不打算更改这些值,因为您的应用程序不能同时在两个环境中运行或在它们之间切换,这意味着您不需要在应用程序的生存期内更改它们,如果一些变量不应更改值,则应将其声明为CONSTANT。因此,无论何时需要访问它,都要将其声明为常量和重要变量。