【问题标题】:Why isn't combineReducers receiving state in Redux?为什么 combineReducers 在 Redux 中不接收状态?
【发布时间】:2016-04-14 18:58:59
【问题描述】:

当我查看通过 combineReducers 调用的减速器时,它没有在参数中获取状态或操作。

我的 reducers 文件是这样的:

import { combineReducers } from 'redux';
import nav from './reducers/nav';
import pages from './reducers/pages';
import entities from './reducers/entities';

export default function(initialData) {

  return function(state, action) {
    if (!state) {
      console.log('no state', initialData);
      return initialData;
    }

    // This is showing state as having expected value
    console.log('state', state);

    return combineReducers({
      nav,
      pages,
      entities
    });
  }
};

我的店铺初始化是这样的:

import reducerWrapper from './reducers';

// Initial state is defined above
var reducers = reducerWrapper(initialState),
    store = Redux.createStore(reducers, initialState);

example code on the site 不使用包装器(我在其他示例中看到过)。我也试过了,但没有用。我的意思是,在任何一个例子中,我都不确定根据写出的内容如何获得状态/动作。我觉得我在这里错过了一些魔法。

更新 现在是 reducers 文件:

import { combineReducers } from 'redux';
import nav from './reducers/nav';
import pages from './reducers/pages';
import entities from './reducers/entities';

export default combineReducers({
  nav,
  pages,
  entities
});

后跟store = Redux.createStore(reducerWrapper, initialState),也不起作用,即使我删除了reducerWrapper 内的包装并只导出默认的combineReducers`

【问题讨论】:

    标签: reactjs react-redux


    【解决方案1】:

    这里不容易看到答案。问题是我的减速器没有默认状态。

    商店在这里触发一个INIT事件:https://github.com/reactjs/redux/blob/master/src/createStore.js#L204

    然后它最终到达这里: https://github.com/reactjs/redux/blob/master/src/combineReducers.js#L52

    意思是如果我的reducer 是function (state, action) { return state } 而不是function (state='anyDefaultValue') { return state }combineReducer 会报错说reducer 没有返回状态

    【讨论】:

      【解决方案2】:

      combineReducers 返回一个需要用stateaction 调用的函数。您可以直接导出:

      const rootReducer = combineReducers(...);
      export default rootReducer;
      

      或者你可以像现在这样包装它:

      const rootReducer = combineReducers(...);
      export default function (initialData) {
        return function (state, action) {
          if (!state) {
            console.log('no state', initialData);
            return initialData;
          }
      
          // This is showing state as having expected value
          console.log('state', state);
      
          return rootReducer(state, action);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2022-07-16
        • 2020-12-20
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        相关资源
        最近更新 更多