Javascript 为什么Redux中的reducer看起来是默认调用的?

Javascript 为什么Redux中的reducer看起来是默认调用的?,javascript,redux,Javascript,Redux,我正在运行一个简单的Redux reducer和store,但由于某些原因,默认情况下会调用Redux reducer。这正常吗 const apiWrapper = (state = {}, action) => { switch(action.type) { case "HELLO": console.log("hello"); return state; break; default: console.log("de

我正在运行一个简单的Redux reducer和store,但由于某些原因,默认情况下会调用Redux 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
也在那里?下面是一个。

在创建存储时,Redux会在内部调度一个虚拟操作,以设置初始状态。根据:

创建存储时,Redux将向reducer发送一个虚拟操作,以使用初始状态填充存储。您不需要直接处理虚拟操作。请记住,如果作为第一个参数提供给它的状态是未定义的,并且您已经设置好了,那么reducer应该返回某种初始状态

因此,当第一次调用reducer时,
状态
将未定义,因此将使用默认值
{}
。此外,它将转到
默认值
情况,因为您不应该显式地处理该操作,因此您将获得
控制台.log
。确保在
default
案例中返回状态,以正确设置初始状态


出于好奇,第一个伪调用Redux执行的操作类型是
“@@Redux/INIT”
,表示Redux正在初始化存储并测试它。类似的情况也发生在组合减速机上,用于测试减速机中的不良模式。具体而言,在:


因此,初始调度本质上是为每个reducer提供其各自的状态切片,并填充初始状态树。

您只需记录
操作
…获取Chrome
Redux
插件,您就可以实际浏览该状态并查看触发的所有操作以及每一步的状态。很好的建议,感谢man@samanimeb,但控制台日志将是“未定义”而不是“默认”,因为我没有用动作调用它@OliverCharlesworth它不会(不应该)未定义。Holly molly!我想你只是给了我一个精神上的“点击”,我需要完全理解redux和初始状态@没问题,很高兴我能帮上忙!是的,@Andrew Li的回答很好。您可能还想通读文档的一节,该节解释了
createStore()
preload state
参数、减速机的默认值和
combineReducers()
实用程序函数之间的交互。
// 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 })