我正在运行一个简单的Redux reducer和store,但由于某些原因,默认情况下会调用reducer。这是正常的吗?
const apiWrapper = (state = {}, action) => {
switch(action.type) {
case "HELLO":
console.log("hello");
return state;
break;
default:
console.log("default");
}
}
const { createStore } = Redux;
const store = createStore(apiWrapper);
store.dispatch({ type: "HELLO" });
上面的代码段输出:
"default"
"hello"
我只希望它能够记录hello
,为什么default
呢?这是JSBin。
答案 0 :(得分:6)
Redux在创建存储时在内部调度虚拟动作以设置初始状态。根据{{3}}:
创建商店时,Redux会向您的reducer发送一个虚拟操作,以使用初始状态填充商店。您并不打算直接处理虚拟动作。请记住,如果作为第一个参数赋予它的状态未定义,你的reducer应返回某种初始状态,并且你已经全部设置了。
因此,当您的reducer 首次被调用时,state
将被取消定义,因此将使用您的默认值{}
。此外,它将转到default
案例,因为您不应该明确处理该操作,因此您获得console.log
。确保在default
情况下返回状态以正确设置初始状态。
出于好奇,Redux执行的第一个虚拟调用的动作类型是"@@redux/INIT"
,表示Redux正在初始化商店并对其进行测试。类似的事情发生在combineReducers
上,以测试Reducer中的坏模式。具体来说,在Redux documentation:
// When a store is created, an "INIT" action is dispatched so that every // reducer returns their initial state. This effectively populates // the initial state tree. dispatch({ type: ActionTypes.INIT })
因此,初始调度基本上为每个reducer提供了相应的状态切片,并填充了初始状态树。