node.js - 为什么 redux reducer 得到“未定义”而不是初始状态?
问题描述
我用 NodeJS 和 redux 创建了一个玩具示例。我创建一个这样的商店:
var initialState = {config: defaultConfig, customData: data};
const store = createStore(reducers, initialState)
我确定defaultConfig
并data
定义了,即我真的在声明之前停止了调试器,我可以确认配置确实存在。但是,在减速器内部,状态是undefined
. 为什么?!
减速器是:
const configReducer = (config: any, action: any): any =>{
return config;
}
const customData = (customData: any, action: any): any => {
return customData;
}
const reducers = combineReducers({config: configReducer, customData: customDataReducer})
所以我明确给出了一个初始状态,但是 redux 会用undefined
.
我知道我可以将初始状态作为减速器中的默认参数,或者使用任何其他解决方法。这不是这里的问题。
问题是:如果我在构建商店时通过初始状态,为什么这不起作用。
解决方案
此行为特定于combineReducers
:
任何传递给 combineReducers 的 reducer 都必须满足以下规则:
对于任何无法识别的动作,它必须返回给它的状态作为第一个参数。
它绝不能返回未定义的。通过提前返回语句错误地执行此操作太容易了,因此如果您这样做, combineReducers 会抛出异常,而不是让错误在其他地方表现出来。
如果给它的状态是未定义的,它必须返回这个特定减速器的初始状态。根据前面的规则,初始状态也不能是未定义的。使用 ES6 可选参数语法指定它很方便,但您也可以显式检查第一个参数是否未定义。
With combineReducers
,reducer最初被调用 withundefined
来断言它不会违反这些规则。只有这样它才会被调用initialState
。
SoinitialState
旨在使用初始值对状态进行水合,而不是提供默认值。
一个 reducer 应该能够处理意外操作的意外状态(default
子句 in switch
),在这种情况下,初始值应该被强制为除 之外的任何值undefined
,例如:
const configReducer = (config: any = null, action: any): any =>{
return config;
}
const customData = (customData: any = null, action: any): any => {
return customData;
}
推荐阅读
- javascript - 如何调整我的“折纸到月球”代码
- r - 使用 R 和 ggplot 的堆积条形图
- google-app-engine - Google App Engine 为默认域提供错误的 HTTPS 证书
- msbuild - Version conflicts when trying to use MSBuild from a Console project
- vba - splitting word document into sections: how to control update of page numbering
- maven - Artifactory 无法解析没有版本的插件工件
- mysql - 更新mysql中的乘法名称
- typescript - 如何使元素 0 可选?
- openedge - 半动态查询和数据库安全
- mono - yocto 无法构建 mono-xsp