为什么在Redux中默认情况下会看到减速器?

时间:2017-06-20 00:10:49

标签: javascript redux

我正在运行一个简单的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

1 个答案:

答案 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提供了相应的状态切片,并填充了初始状态树。