尽管为 createStore() 提供了 initialState,但为什么我会得到“Reducer \[...\] 在初始化期间返回未定义”?

新手上路,请多包涵

我在我的 redux createStore 方法中设置了 InitialState ,并且我相应的 InitialState 作为第二个参数

我在浏览器中遇到错误:

 <code>Uncaught Error: Reducer "postsBySubreddit" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined.</code>

代码在这里:

 import { createStore, applyMiddleware } from 'redux'
import thunkMiddleware from 'redux-thunk'
import createLogger from 'redux-logger'
import rootReducer from '../reducers/reducers'
import Immutable from 'immutable'
const loggerMiddleware = createLogger()
//const initialState=0
function configureStore() {
    return createStore(
    rootReducer,
     {postsBySubreddit:{},selectedSubreddit:'reactjs'},
     applyMiddleware(
     thunkMiddleware,
    loggerMiddleware
  )
 )
}
  export default configureStore

我在 Root.js 中调用了 configeStore 方法:

  import React, { Component } from 'react'
 import { Provider } from 'react-redux'
 import configureStore from '../store/configureStore'
 import AsyncApp from './AsyncApp'
 import Immutable from 'immutable'
 const store = configureStore()
 console.log(store.getState())
 export default class Root extends Component {
 render() {
   return (
     <Provider store={store}>
       <AsyncApp />
     </Provider>
  )
 }
}

但我猜这个 initateState 有问题:

 import { combineReducers } from 'redux'
import {reducerCreator} from '../utils/creator'
import Immutable from'immutable'
import {SELECT_SUBREDDIT, INVALIDATE_SUBREDDIT ,REQUEST_POSTS, RECEIVE_POSTS} from '../actions/action'
let initialState=Immutable.fromJS({isFetching: false, didInvalidate: false,items:[]})

function selectedSubreddit(state, action) {
  switch (action.type) {
  case SELECT_SUBREDDIT:
    return action.subreddit
  default:
    return state
  }
}
function postsBySubreddit(state, action) {
  switch (action.type) {
    case INVALIDATE_SUBREDDIT:
    case RECEIVE_POSTS:
    case REQUEST_POSTS:
      return Object.assign({}, state, {
        [action.subreddit]: posts(state[action.subreddit], action)
      })
    default:
      return state
  }
}
function posts(state=initialState,action) {
  switch (action.type) {
    case INVALIDATE_SUBREDDIT:
      return state.merge({
        didInvalidate: true
      })
    case REQUEST_POSTS:
      return state.merge({
        isFetching: true,
        didInvalidate: false
      })
    case RECEIVE_POSTS:
      return state.merge({
        isFetching: false,
        didInvalidate: false,
        items: action.posts,
        lastUpdated: action.receivedAt
      })
    default:
      return state
    }
}

const rootReducer = combineReducers({
  postsBySubreddit,
 selectedSubreddit
})
export default rootReducer

但是如果我在我的每个子减速器中设置 initialState 它可以正常做词。有问题?

原文由 Ice Wilder 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 667
2 个回答

--- 中的 createStore() initialState 论点经常使人绊倒。它从来不是一种手动“初始化”应用程序状态的方式。它唯一有用的应用是:

  • 从 JSON 状态负载启动服务器呈现的应用程序。
  • 从保存到本地存储的状态“恢复”应用程序。

这意味着您永远不会手动编写 initialState 并且在大多数应用程序中您甚至不使用它。相反,reducer 必须始终指定它们自己的初始状态,并且 initialState 只是一种在您拥有它的现有序列化版本时预填充该状态的方法。

所以 这个答案 是正确的:你 需要 在你的减速器中定义初始状态。将它提供给 createStore() 是不够的,并不意味着是一种在代码中定义初始状态的方法。

原文由 Dan Abramov 发布,翻译遵循 CC BY-SA 3.0 许可协议

我有同样的错误,但我没有包含默认情况

function generate(state={} ,action) {
  switch (action.type) {
    case randomNumber:
      return {
        ...state,
        random: action.payload
      }
    default: // need this for default case
      return state
   }
}

原文由 Isaac Pak 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题