我有一个root reducer,它从另一个文件导入动作类型常量。由于createstore首次调用reducer时,这些常量的值未定义。
我试图将这些常量转换为函数,但给了我错误-“对象不能为函数”。当我打印它的类型时,它最初给我未定义的内容,但后来调用时会打印出type-function。
我的目录结构是这样的
helpers/
-index.js
-store.js
-constants.js
reducers/
-index.js
-rootReducer.js
每个index.js文件的类型都是-
export * from './rootReducer'
这是我的商店文件(store.js)-
import { createStore, applyMiddleware, compose } from 'redux'
import { rootReducer } from '../reducers'
import ReduxThunk from 'redux-thunk'
const initialState = {}
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose
export const store = createStore(
rootReducer,
initialState,
composeEnhancers(applyMiddleware(ReduxThunk))
)
这是我的常量文件(constants.js)-
export const constants = {
BENCHMARK_DATA_RECEIVED: 'BENCHMARK_DATA_RECEIVED',
BENCHMARK_DATA_FAILED: 'BENCHMARK_DATA_FAILED',
}
这是我的根减少器(rootReducer.js)-
import { constants } from '../helpers'
export const rootReducer = (state = [], action) => {
console.log(constants)
// Initially print undefined
// After that prints correct value
switch (action.type) {
case 'BENCHMARK_DATA_RECEIVED':
return { ...state, benchmark_data: action.payload }
default:
return state
}
}
我不确定导致此问题的原因,但仅在第一次使用reducer时才会发生(很可能在创建store时)。我在Google上搜索了很多,但没有遇到任何此类问题。也许我的设置有些问题。同样,将这些常量打印在任何地方(例如动作创建者)都可以。
答案 0 :(得分:1)
要总结评论中的讨论,您可以直接从化简器中的constants.js
导入,同时调查您拥有的文件结构。