为什么 redux reducer 变得“未定义”而不是初始状态?

Jos*_*ose 5 node.js redux react-redux

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

var initialState = {config: defaultConfig, customData: data};
const store = createStore(reducers, initialState)
Run Code Online (Sandbox Code Playgroud)

我确保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})
Run Code Online (Sandbox Code Playgroud)

所以我明确地给出了一个初始状态,但 redux 会用undefined.

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

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

Est*_*ask 3

此行为特定于combineReducers

传递给combineReducers 的任何reducer 都必须满足以下规则:

  • 对于任何无法识别的操作,它必须返回作为第一个参数提供给它的状态。

  • 它绝不能返回未定义的。通过早期的 return 语句很容易错误地执行此操作,因此如果您这样做,则 mergeReducers 会抛出异常,而不是让错误在其他地方显现出来。

  • 如果给定的状态未定义,则它必须返回该特定减速器的初始状态。根据前面的规则,初始状态也不能是未定义的。使用 ES6 可选参数语法指定它很方便,但您也可以显式检查第一个参数是否未定义。

对于,最初会调用combineReducers减速器来断言它不会违反这些规则。只有这样它才会被调用。undefinedinitialState

因此initialState旨在用初始值来水合状态,而不是提供默认值。

减速器应该能够处理意外操作(default中的子句switch)的意外状态,在这种情况下,初始值应该强制为除 之外的任何值undefined,例如:

const configReducer = (config: any = null, action: any): any =>{
        return config;
}

const customData = (customData: any = null, action: any): any =>  {
        return customData;
}
Run Code Online (Sandbox Code Playgroud)

  • “使用combineReducers,一个reducer最初是用undefined调用的,以断言它不会违反这些规则。只有这样,它才会用initialState来调用。”。该声明需要位于 redux 文档中。 (2认同)