【问题标题】:Getting "Uncaught TypeError: Cannot read property 'results' of undefined " when mapping the data from API using Redux使用 Redux 从 API 映射数据时出现“Uncaught TypeError: Cannot read property 'results' of undefined”
【发布时间】:2020-06-16 14:11:49
【问题描述】:

我正在尝试从 React & Redux 中的 movieDB api 映射数据并收到错误:

Uncaught TypeError: Cannot read property 'results' of undefined

为了更好地理解,这是我的代码。

reducers/moviesReducer.js

const initialState = {
  isFetchingMovies: false,
  isFetchedMovies: false,
  movieList: [],
  fetchingMoviesError: null
}

export const popularMoviesReducer = (state = initialState, action) => {
  switch (action.type) {
    case "FETCHING_POPULAR_MOVIES_START":
      return { ...state, isFetchingMovies: true, fetchingMoviesError: null }
    case "FETCHING_POPULAR_MOVIES_SUCCESS":
      return {
        ...state,
        isFetchingMovies: false,
        isFetchedMovies: true,
        movieList: action.data,
        fetchingMoviesError: null
      }
    case "FETCHING_POPULAR_MOVIES_FAILURE":
      return { ...state, fetchingMoviesError: action.data.error }
    default:
        return state
  }
}

reducers/index.js

import { combineReducers } from "redux"
import { popularMoviesReducer } from "./moviesReducer"

const rootReducer = combineReducers({
  popularMoviesReducer
})

export default rootReducer

actions/index.js

export const fetchPopularMovies = () => {
  return async dispatch => {
    dispatch({ type: "FETCHING_POPULAR_MOVIES_START" })
    try {
      const res = await axios.get(url)
      dispatch({
        type: "FETCHING_POPULAR_MOVIES_SUCCESS",
        data: { popularMovies: res.data }
      })
    } catch (err) {
      dispatch({
        type: "FETCHING_POPULAR_MOVIES_FAILURE",
        error: { error: "Something went wrong" }
      })
    }
  }
}

组件/Popular.js

import React, { Component } from "react"
import { connect } from "react-redux"
import { fetchPopularMovies } from "../actions/index"

class Popular extends Component {

  componentDidMount() {
    this.props.dispatch(fetchPopularMovies())
  }

  render() {
    const { isFetchingMovies, movieList } = this.props

    return isFetchingMovies ? (
      <p>Loading...</p>
    ) 

    :

    (

      <div>
        {
          movieList && movieList.popularMovies.results.map(movie => {
            <p>{movie.title}</p>
          })
        }
      </div>
    )
  }
}

const mapStateToProps = state => {
  return {
    isFetchingMovies: state.popularMoviesReducer.isFetchingMovies,
    movieList: state.popularMoviesReducer.movieList
  }
}

export default connect(mapStateToProps)(Popular)

每当我必须在我的组件中显示一些数据时,我总是会遇到这种问题。我最终需要知道如何摆脱它!

更新:这是 React-Dev-Tools 中 Popular.js 中内容的屏幕截图。 Screenshot

【问题讨论】:

    标签: arrays reactjs redux thunk


    【解决方案1】:

    改变你获取电影的方式:

    使用 mapDispatchToProps 之类的函数来调度组件的操作:

    const mapDispatchToProps = dispatch => ({
     fetch: () => dispatch(youractions.fetchPopularMovies())
    })
    

    在你的组件生命周期钩子中:

    componentDidMount() {
        this.props.fetch();
      }
    

    connect 调用现在应该如下所示:

    export default connect(mapStateToProps, mapDispatchToProps)(Popular)
    

    更新:

    您还应该在 map 函数中返回标签,并且还应该使用 key prop(应该是唯一的)。

      <div>
       {
          movieList && movieList.popularMovies.results.map(movie => {
            return <p key={movie.title}>{movie.title}</p>
          })
        }
      </div>
    

    假设标题是唯一的,如果你有 ID,那么你也可以使用它们。

    更新 #2:

    reducer 中有一个逻辑错误,初始状态中的 isFetchingMovies 应该是 true 而不是 false,因为如果是 false,您将尝试在获取电影之前显示它们。

    所以把你的initialState改成这个:

    const initialState = {
      isFetchingMovies: true,
      isFetchedMovies: false,
      movieList: [],
      fetchingMoviesError: null
    }
    

    请注意,渲染方法是在componentDidMount 之前调用的。您似乎还拥有isFetchedMovies,它在获取电影时会发生变化,您可以在mapStateToProps 中使用该状态并将其用作显示加载或电影的检查。

    【讨论】:

    • 那么,在这里使用mapDispatchToProps 有什么意义?
    • 您可以将第二个参数(一个获取调度参数的函数)传递给连接调用。所以它基本上将函数映射到派发动作的道具。
    • 阅读this
    • 我认为这个问题的问题不是调度,而是从 api 返回的数组。我正在获取数据,但在组件中正确显示它时出现了一些问题。
    • 使用您从 API 获得的响应更新问题。
    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 2019-02-12
    • 2021-09-20
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多