网站搜索

javascript - 使用 combineReducers 时出错 “错误:Reducer ‘assetsReducer’ 在初始化期间返回了 undefined。”


错误:Reducer “assetsReducer” 在初始化期间返回了未定义。如果传递给 reducer 的状态是未定义的,你必须明确返回初始状态。初始状态不能是未定义的。如果你不想为此 reducer 设置值,可以使用 null 来代替 undefined。

在我的 ReactJS 应用中,我有两个 reducers/actions(assets 和 board)。

在我的 store.ts 文件中,我像这样使用 combineReducers:

import { applyMiddleware, createStore, combineReducers } from 'redux'
import { composeWithDevTools } from 'redux-devtools-extension'
import thunkMiddleware from 'redux-thunk'

import { IinitialState } from './shared/types'
// import reducer from './reducers/assets/'
import assetsReducer from './reducers/assets'
import boardReducer from './reducers/board'

const rootReducer = combineReducers({
  assetsReducer,
  boardReducer
});

export const defaultInitialState = {
  assets: [],
  portfolio: [],
  loading: false,
  overlay: false
};

console.log('rootReducer', rootReducer);

export function initializeStore(initialState: IinitialState = defaultInitialState) {
  return createStore(
    rootReducer,
    initialState,
    composeWithDevTools(applyMiddleware(thunkMiddleware))
  )
}

这应该是正确的,但当我在本地主机刷新我的应用时,我得到了以下 TypeScript 错误,以及上面的控制台错误。

Type 'IinitialState' has no properties in common with type 

'DeepPartial<{ assetsReducer: { assets: any; loading: boolean; portfolio: never[]; overlay: boolean; }; boardReducer: { overlay: any; assets: never[]; portfolio: never[]; loading: boolean; }; }>.ts(2559)'

资产Reducer:

import { Actions } from '../actions/assets'
import { defaultInitialState } from '../store'

export default (state = defaultInitialState, action: any) => {
  switch (action.type) {
    case Actions.GET_ALL_ASSETS: {
      const { assets } = action;
      return {
        ...state,
        assets,
        loading: false
      };
    }

    default:
      return state;
  }
};

boardReducer

import { Actions } from '../actions/board'
import { defaultInitialState } from '../store'

export default (state = defaultInitialState, action: any) => {
  switch (action.type) {
    case Actions.SET_OVERLAY_STATE: {
      const { overlay } = action;
      return {
        ...state,
        overlay
      };
    }

    default:
      return state;
  }
};

答案#1

您的初始状态不正确。您的初始状态应该看起来像这样:

export const defaultInitialState = {
  assetsReducer: {assets: [], loading: false, portfolio: [], overlay: false},
  boardReducer: {assets: [], loading: false, portfolio: [], overlay: false},
}

有关此的更多信息可以在 Redux 文档中找到

答案#2

除了其他回复之外,看起来你有一个循环引用的问题。

store.ts 导入了 assetsReducer.ts,但是 assetsReducer 试图导入 store 来获取它的初始默认状态值。

因此,当 assetsReducer.ts 加载时,store.ts 尚未完成评估,defaultInitialState 是未定义的。

你应该重新组织事物,这样就不会再有循环引用了。最简单的方法是让 assetsReducer.ts 定义它自己的初始状态值(如果需要在其他地方引用,也可以单独导出它)。