То, почему я получаю “Редуктор […], возвратилось неопределенный во время инициализации” несмотря на обеспечение initialState к createStore ()?

Я установил InitialState в своем возвращении createStore метод и я соответствующий 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

и я вызвал configeStoreметод в Root.js:

 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 в моем каждом sub редукторе это может, обычно делал слово. Что-то не так?

57
задан 16 April 2016 в 01:08

1 ответ

tl; доктор

Удостоверяется что:

  • Вы на самом деле передаете данные своему редуктору через создателя действия/действия!
  • редуктор не возвращается undefined.

Пример

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case 'SET_DATA':
      debugger // Place a breakpoint for investigation
      const result = update(state, {$set: action.data});
      // `result` is `undefined` if `action.data` is too
      return result;
    default:
      return state;
  }
}

В этом случае, если Вы случайно передаете undefined action.data через Вашего создателя действия затем , react-addons-update возвратится undefined, который прибыл из той переменной. Так как это перезаписывает целое состояние редуктора, оно возвратит это undefined, который инициирует ошибку.

Отладка

можно отладить это путем исследования этих мест:

  • , Где редуктор создает новое состояние. Поместите точку останова в ту часть, чтобы удостовериться, что Вы не получаете или возвращаетесь undefined туда.
  • , Куда данные передаются создателю действия.
0
ответ дан 1 November 2019 в 15:36

Другие вопросы по тегам:

Похожие вопросы: