在状态中访问对象属性时返回 null?

Returning null when accessing object properties in state?

在我的 React.js 应用程序中,我正在从 API 获取引用并将其存储在状态对象中,当我试图访问存储在状态中的对象的属性时。返回空值。

代码:

import React, { Component } from "react";

export default class Quotes extends Component {
  constructor(props) {
    super(props);

    this.state = {
      quote: null,
    };
  }

  componentDidMount() {
    fetch("https://quote-garden.herokuapp.com/api/v2/quotes/random")
      .then((response) => response.json())
      .then((quote) => this.setState({ quote: quote.quote }))
      .catch((error) => console.log(error));
  }
  render() {
    console.log(this.state.quote.quoteText); //This is returning null
    console.log(this.state.quote); //This is working fine.
    return (
      <div>
        <p>// Author of Quote</p>
      </div>
    );
  }
}

我是 React.js 的新手,我为这个问题绞尽脑汁大约 2 小时。我没有在网上找到任何解决方案

output showing quote object

当我尝试 console.log(this.state.quote) 它打印出这个输出,很好。

当我尝试 console.log(this.state.quote.quoteText) 它会 return can not read property

output showing can not find property

您必须注意,您正在尝试异步获取数据,并且还在渲染后 运行 的 componentDidMount 中获取数据,因此会有一个初始渲染周期,其中您将无法获得数据你和 this.state.quote 将为空

处理此类场景的最佳方式是保持加载状态,只有在数据可用后才进行所有处理

import React, { Component } from "react";

export default class Quotes extends Component {
  constructor(props) {
    super(props);

    this.state = {
      quote: null,
      isLoading: true,
    };
  }

  componentDidMount() {
    fetch("https://quote-garden.herokuapp.com/api/v2/quotes/random")
      .then((response) => response.json())
      .then((quote) => this.setState({ quote: quote.quote, isLoading: false }))
      .catch((error) => console.log(error));
  }
  render() {
    if(this.state.isLoading) {
     return <div>Loading...</div>
   }
    console.log(this.state.quote.quoteText); //This is returning proper value
    console.log(this.state.quote); 
    return (
      <div>
        <p>// Author of Quote</p>
      </div>
    );
  }
}

当您访问 quoteText 而不检查对象中的键是否存在时,它会抛出错误 -

render(){
  if(this.state.quote && this.state.quote.hasOwnProperty('quoteText')){ 
    console.log(this.state.quote.quoteText);
   }
}