开发者问题收集

Redux 状态变得未定义

2017-09-11
3572

我尝试在通过 Redux 获取数据时添加加载屏幕,并使用 async await 重写我的承诺,但效果并不理想,当我在 mapStateToProps 中记录我的 state 时,我的数据未定义:

enter image description here

但我可以看到这个:

enter image description here

我不知道为什么我可以在那里看到我的数据,但在尝试通过 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
  }
}

我想向您展示我的商店,因为我正在使用 autoRehydratepersistStore

商店:

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 对象): 在此处输入图片描述

1个回答

您的 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 似乎存在类似的问题)。

jonahe
2017-09-11