【问题标题】:I try to get data com The Movie db api but this error appear: "TypeError: Cannot read property '0' of null "我尝试获取数据 com The Movie db api 但出现此错误:“TypeError: Cannot read property '0' of null”
【发布时间】:2019-07-31 00:00:20
【问题描述】:

我想从 The Movie DB api 中检索数据并只显示 4 部电影,但由于某种原因它什么也没得到。

import React, {Component} from 'react';
import './App.css';
class App extends Component{

state = {
 popularMovies: null
}

async retrievePopularMovies(){
  const url = 'https://api.themoviedb.org/3/movie/popular?api_key=KEY_HERE';
  const response = await fetch(url);
  const data = await response.json();
  this.setState({popularMovies: data.results});
}
render(){
    return(
      <div>
      <h3>Popular Movies</h3>
      <div>
        {this.state.popularMovies[0].title}
      </div>

      </div>
    )
  }
}

export default App;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

它应该在屏幕上返回 ID 为 0 的电影的标题,但我得到的唯一错误是:

TypeError: 无法读取 null 的属性“0”

这里指出了问题->> {this.state.popularMovies[0].title}

【问题讨论】:

  • 请注意,API 密钥是有效的,我可以在浏览器中检索数据
  • 你真的在执行retrievePopularMovies方法吗?
  • 异步不会自动执行吗?
  • 检查您的网址和您正在制作的方法
  • @userct 不,你不需要像componentDidMount这样的方法运行它

标签: reactjs


【解决方案1】:

我认为您没有执行retrievePopularMovies 方法,如果您执行该方法,您应该处理视图,因此它不会尝试读取初始状态的空值,它应该在您的render 中看起来像这样方法

const movies = this.state.popularMovies ? (
  <div>
    {this.state.popularMovies[0].title}
  </div>
) : (
  <div>Loading movies...</div>
);
return (
  <div>
    <h3>Popular Movies</h3>
    <div>
      {movies}
    </div>
  </div>
)

这将在调用 API 并执行 retrievePopularMovies 方法时显示文本“正在加载电影...”。完成后,它将自动更新视图。

【讨论】:

  • 我试过你的代码,它返回这个错误:TypeError: Cannot read property 'title' of undefined
  • 那么你的API没有返回你想要的信息,你可以调试看看它返回了什么或者在从API获取数据后添加一个console.log
【解决方案2】:

正如@Mihályi Zoltán 所说,popularMovies 的初始值为 null,您目前正尝试访问该 null 的第一项,这是不可能的。

一个好的做法是将popularMovies 声明为一个空列表 ([]),然后对其进行迭代。在这种情况下,您将无法访问该空列表的第一项,因为没有任何项。

您正在使用基于类的组件,所以要充分利用它!使用componentDidMount生命周期方法并在其中进行api调用。然后像你一样设置状态,数据就可用了。

并且,正如@Pietro Nadalini 建议的那样,使用简单的三元有条件地渲染它。

【讨论】:

    【解决方案3】:

    看来你做的一切都正确除了调用 API

    您应该在组件挂载时添加对函数“retrievePopularMovies”的调用。

    另外,您没有跟踪 API 调用的状态。因此,当组件App > 第一次呈现时,您将状态中的“popularMovies”为空。 而且您无法访问 null 的第 0 个索引。

    您的代码可以像这样更新以正常工作 -

    import React, { Component } from "react";
    class App extends Component {
      state = {
        popularMovies: null
      };
    
      async componentDidMount() {
        await this.retrievePopularMovies();
      }
    
      async retrievePopularMovies() {
        const url =
          "https://api.themoviedb.org/3/movie/popular?api_key=651925d45022d1ae658063b443c99784";
        const response = await fetch(url);
        const data = await response.json();
        this.setState({ popularMovies: data.results });
      }
      render() {
        return (
          <div>
            <h3>Popular Movies</h3>
            <div>
              {!!this.state.popularMovies && this.state.popularMovies[0].title}
            </div>
          </div>
        );
      }
    }
    
    export default App;
    

    注意更新:

    1. 在“componentDidMount”生命周期中,我们调用 API 以获取响应。
    2. 在渲染期间,我们检查“popularMovies”状态变量中是否有可用的响应数据,然后尝试访问第 0 个位置数据的标题。

    【讨论】:

    • 成功了!谢谢!
    【解决方案4】:

    正如@Mihályi Zoltán 提到的,我认为您需要设置状态的初始值popularMovies: [] 而不是保留它null

    【讨论】:

    • 我现在就这样做了,它不会抛出那个错误,但是当尝试从 ID 0 检索数据时,它给了我一个类似的错误
    • 你能确定你调用的是函数retrievePopularMovies吗?
    【解决方案5】:

    popularMovies 的初始值为 null。您应该处理初始状态。 里面render

    if (this.state.popularMovies === null) {
      return 'Loading...'
    }
    

    【讨论】:

    • 我该如何处理?
    • renderjs if (this.state.popularMovies === null) { return 'Loading...' }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2019-10-26
    • 1970-01-01
    • 2020-09-05
    • 2016-10-03
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多