首页 > 解决方案 > 为什么 redux reducer 得到“未定义”而不是初始状态?

问题描述

我用 NodeJS 和 redux 创建了一个玩具示例。我创建一个这样的商店:

var initialState = {config: defaultConfig, customData: data};
const store = createStore(reducers, initialState)

我确定defaultConfigdata定义了,即我真的在声明之前停止了调试器,我可以确认配置确实存在。但是,在减速器内部,状态是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.

我知道我可以将初始状态作为减速器中的默认参数,或者使用任何其他解决方法。这不是这里的问题。

问题是:如果我在构建商店时通过初始状态,为什么这不起作用。

标签: node.jsreduxreact-redux

解决方案


此行为特定于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;
}

推荐阅读