代码之家  ›  专栏  ›  技术社区  ›  Vivek

createStore如何在redux中从reducer函数中提取initialState?

  •  1
  • Vivek  · 技术社区  · 6 年前

    我正在检查redux的代码, createStore.js ,我无法理解它是如何从reducer函数中提取初始状态的。如果初始状态在reducer函数中指定为第一个参数。

    https://github.com/reduxjs/redux/blob/master/src/createStore.js#L31

    代码正在启动 currentState 从…起 preloadedState

    例如,减速器功能为:

    const counter = ( state = 2, action) => {
      switch(action.type){
        case 'INCREMENT':
            return state + 1;
        case 'DECREMENT':
          return state - 1;
        default:
          return state;   
      }
      
    }
    3 回复  |  直到 6 年前
        1
  •  1
  •   Estus Flask    6 年前

    初始状态不是从减速器中“提取”的。由于减速器的工作方式,状态总是由减速器转换。这也是在商店创建时完成的,因为 INIT internal action is dispatched . 如果一个国家 undefined ,它是用reducer参数中指定的默认值初始化的。

        2
  •  1
  •   Shabab Qaisar    6 年前

    Redux connect方法使用未定义状态触发事件名INIT,因此,如果您将未定义状态替换为自己的状态,它将替换该状态。这就是为什么default:case存在,所以它可以返回您的初始状态。 阅读有关connect()方法REDUX的更多信息。

        3
  •  1
  •   Derek Nguyen    6 年前

    在您的示例中,使用了reducer函数

    const counter = (state = 2, action) => ...
    

    实际上,您并不是在传递默认状态本身,而是在为状态设置默认值。

    const counter = (state, action) => {
      if (state == null) state = 2; // not good practice, just for illustration purpose
      ...
    }
    

    因此,当reducer传递给createStore时,createStore只运行reducer;状态参数未定义,因此其设置为 2 .

    Redux文档可能会更清楚一些:

    还原程序还可以通过查找未定义的传入状态参数并返回希望用作默认值的值来指定初始值。这可以通过在reducer内部进行显式检查来完成,也可以使用ES6默认参数值语法:function myReducer(state=someDefaultValue,action)。

    redux docs