我用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
来调用化简器。
我知道我可以将初始状态作为默认参数放入化简器中,或使用其他解决方法。这不是这里的问题。
问题是:如果我在建立商店时通过初始状态,为什么这不起作用。
答案 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中显式设置初始状态。
答案 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