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

时间:2018-10-27 04:40:31

标签: node.js redux react-redux

我用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来调用化简器。

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

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

4 个答案:

答案 0 :(得分:0)

此行为特定于combineReducers

  

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

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

  •   
  • 它绝不能返回未定义。通过早期return语句错误地执行此操作太容易了,因此如果您这样做,则CombineReducers会引发   而不是让错误显示在其他地方。

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

  •   

对于combineReducers,一个化简器是initially called with undefined,用以断言它没有违反这些规则。只有这样,它才会被initialState调用。

因此initialState旨在将状态与初始值混合,而不提供默认值。

Reducer应该能够处理意外动作(default中的switch子句),在这种情况下,初始值应强制为undefined以外的任何值,例如: / p>

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

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

答案 1 :(得分:0)

在创建商店时提供初始状态不会初始化您的商店。您必须在reducer中显式设置初始状态。

请参阅Why do I get “Reducer [...] returned undefined during initialization” despite providing initialState to createStore()?

答案 2 :(得分:0)

如果您不确定,请替换它...就我而言,当我的服务器由于任何原因而没有数据答复时,也许是因为没有活动的会话,我就遇到了这个问题,因此请在reducer中执行此操作,对我来说是一种魅力:

export default function itemReducer(state = initialState.items | undefined, action){ 
    switch(action.type) 
   { 
         case "LOAD_ITEMS_SUCCESS":
               if(action.items==undefined) { 
                        action.items=[]; 
               }
                return action.items

如果reducer不确定,则将undefined替换为一个空数组,您将不再收到该错误。

干杯!

答案 3 :(得分:0)

我遇到了同样的问题,并且在调试代码时,因为每个状态都维护着一个单独的对象,所以它将是您带有键的对象。

const reducers = combineReducers({config: configReducer, customData: customDataReducer})

在这里,当您获取默认情况下未定义的数据时,状态为

{config:undefined, customData:undefinded}

为什么?:因为CombineReducer函数具有向每个键提供初始状态的选项,或者说如下所示的单独状态,否则可以选择默认情况下传递未定义的初始状态

    const initialRootState={config:{}, customData:{}};
    const reducers = combineReducers({config: configReducer, 
                     customData: customDataReducer});

    const store= createStore(reducers,initialRootState);

现在,当您的reducer初始化为默认情况下的状态

 export default function configReducer(state = initialState, action){}
    //state = initialState even undefined called
 export default function customDataReducer(state = initialState, action){}
    //state = initialState even undefined called

但是由于CombineReducers函数的正常行为,它将以默认的“ undefined” {config:undefined,customData:undefinded}传递初始状态,因此它将返回undefined,并且您的状态对象看起来像 state:{config:{initialState}}用于configReducer state:{customData:{initialState}}用于customDataReducer