2017-04-10 301 views
5

我正在开发我的第一个React/Redux项目。一切都很顺利,然后我试图创建一个新的减速器。我认为这是一个非常简单的,但是当我加载页面时,出现错误“Reducer X在初始化过程中返回undefined”。痕迹说这是在combineReducers()中发生的。我发现了一些类似的问题,但他们没有解决问题。React/Redux reducer在初始化期间返回undefined

在这个问题上:Why do I get “Reducer [...] returned undefined during initialization” despite providing initialState to createStore()?

的问题是,他们在createStore(),这我不这样做使用的初始化状态。

在这个问题上:Why does my Redux reducer think my state is undefined?

的问题是在减速,这是我有一个缺少的默认返回值。

我的减速机代码如下。我在开头有一个console.log(),它根本没有被调用。

减速器/ reducer_which_sorter.js

import { SORT_CAMPERS } from '../actions/index'; 

export default function(state = null, action) { 
    console.log("action is", action); 
    switch(action.which) { 
     case 'recent': 
     case 'alltime': 
      return action.which; 
      break; 
     default: 
      return state; 
    } 

    return state; 
} 

减速器/ index.js

import { combineReducers } from 'redux'; 
import Campers from './reducer_camper_list'; 
import ActiveSorter from './reducer_which_sorter'; 

const rootReducer = combineReducers({ 
    campers: Campers, 
    activeSorter: ActiveSorter 
}); 

export default rootReducer; 

一切编译罚款。没有来自webpack的错误。我有双重,三重和四重检查我的文件路径。我没有看到任何拼写错误。任何人都可以看到我在这里失踪的东西?

+0

在引发错误并刷新页面的行上放置一个断点。然后,当它在调试器中断时 - 你有完整的细节发生了什么。 – zerkms

回答

2

Redux的要求是对动作使用type属性,而不是像您在示例中所做的那样对which使用属性。由于您的console.log检查未被调用,因此问题可能出在您的其他reducer上(您的问题中未显示)。

这个问题的原因在于combineReducers正在使用特殊的INIT操作类型调用您的reducer函数:

const initialState = reducer(undefined, { type: ActionTypes.INIT }) 

来源:https://github.com/reactjs/redux/blob/master/src/combineReducers.js

你的功能,因为它接通 'action.which' 而不是 'action.type',失败只是不确定返回任何东西。

+0

我改变了我的逻辑,所以这段代码在我的其他reducer中,因为它实际上只有一行。现在一切正常。我认为你是正确的转换。 – RaneWrites

1

我在开头有一个console.log(),它根本没有被调用。

这很奇怪,因为减速机功能必须至少用@@INIT动作调用一次。

尝试测试您的rootReducer是否被调用。将其更改为:

const rootReducer = (state = {}, action) => { 
    console.log('Test if rootReducer is ever called') 

    return { 
    campers: Campers(state.campers, action), 
    activeSorter: ActiveSorter(state.activeSorter, action) 
    } 
} 

如果它没有被调用,那么问题是某处更高,而不是在减速本身。