Redux 状态变得未定义
我尝试在通过 Redux 获取数据时添加加载屏幕,并使用 async await 重写我的承诺,但效果并不理想,当我在
mapStateToProps
中记录我的
state
时,我的数据未定义:
但我可以看到这个:
我不知道为什么我可以在那里看到我的数据,但在尝试通过
mapStateToProps
访问它。
这是一些代码:
操作:
const setDoors = data => {
return {
type: 'FETCH_DOORS_SUCCESS',
payload: {
setDoors: data
}
}
}
const setControllers = data => {
return {
type: 'FETCH_CONTROLLERS_SUCCESS',
payload: {
setControllers: data
}
}
}
export const fetchDoors = () => async dispatch => {
try {
dispatch({ type: 'FETCH_DOORS' })
const doors = await axios.get(`${settings.hostname}/locks`)
dispatch({ type: 'FETCH_DOORS_SUCCESS', payload: doors.data })
dispatch({ type: 'FETCH_CONTROLLERS' })
const controllers = await axios.get(`${settings.hostname}/controllers`)
dispatch({ type: 'FETCH_CONTROLLERS_SUCCESS', payload: controllers.data })
} catch (err) {
throw new Error(err)
}
}
Reducer:
const initialState = {
isLoading: false
}
export const fetchDoors = (state = initialState, action) => {
switch (action.type) {
case 'FETCH_DOORS':
return { ...state, isLoading: true }
case 'FETCH_DOORS_SUCCESS':
return { ...state, doors: action.payload.setDoors, isLoading: false }
case 'FETCH_CONTROLLERS':
return { ...state, isLoading: true }
case 'FETCH_CONTROLLERS_SUCCESS':
return {
...state,
controllers: action.payload.setControllers,
isLoading: true
}
default:
return state
}
}
我想向您展示我的商店,因为我正在使用
autoRehydrate
和
persistStore
。
商店:
const enhancer = compose(
autoRehydrate(),
applyMiddleware(...middlewares),
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)
const store = createStore(rootReducers, {}, enhancer)
persistStore(store)
export default store
问题:
所以我想知道如何才能停止到处都出现未定义的情况并继续使用我的应用程序。我真的很感激所有能给我的帮助。
谢谢!
更新:
在 @jonahe(感谢我的朋友)的建议下,我已将代码更新为:
dispatch({ type: 'FETCH_DOORS' })
const doors = await axios.get(`${settings.hostname}/locks`)
dispatch(setDoors(doors.data), { type: 'FETCH_DOORS_SUCCESS' }) // changed this line
但是现在当我记录
state
时,我没有得到未定义的,而是这个(一个
data 对象
):
然后由于我的道具与我的
.filter
、
.map
等的布局方式而出现错误,错误发生后我看到这个(没有
data
对象):
您的
FETCH_DOORS_SUCCESS
的 Reducer 依赖于
payload.setDoors
属性。该属性确实存在于您定义的动作创建器函数中:
const setDoors = data => {
return {
type: 'FETCH_DOORS_SUCCESS',
payload: {
setDoors: data
}
}
}
但您没有使用该动作创建器。您正在使用此代码分派
FETCH_DOORS_SUCCESS
:
dispatch({ type: 'FETCH_DOORS_SUCCESS', payload: doors.data })
您也可以在分派动作的屏幕截图中看到这一点。数据作为
payload
存在,但有效载荷没有预期的结构。有效载荷是一个数组,但 Reducer 期望有效载荷是一个具有
.setDoors
属性的对象。
(并且
FETCH_CONTROLLERS_SUCCESS
似乎存在类似的问题)。