开发者问题收集

显示获取的数据问题:对象作为 React child 无效 / TypeError:未定义

2020-10-24
633

我想使用生命周期方法显示从 API 获取的数据。 我设法获取数据(对象)并将数据填充到状态(数组)中。但是我无法在返回部分显示值。

代码的第一部分似乎有效,为了便于阅读,我删除了错误/加载部分:

class App extends Component {
    constructor(props) {
        super(props);
    
        this.state = {
          data: [], //putting data in the state
        };
      }
    
    async componentDidMount() {
        fetch("https://covid19.mathdro.id/api")
        .then((response) => response.json())
        .then(
            (data) => {
                this.setState({
                confirmed: data.confirmed, //populate data in this.state
                recovered: data.recovered,
                deaths: data.deaths,
            });
            }
          );
      }
    
    render() {
        const { confirmed, recovered, deaths } = this.state;
        console.log(confirmed, recovered, deaths);
        ...
    }
    
    export default App;

这是我尝试的第一个返回:

return ( <div> {(confirmed, recovered, deaths)} </div>);

我得到了

Error: Objects are not valid as a React child (found: object with keys {value, detail}). If you meant to render a collection of children, use an array instead.

Console.log 确实返回了对象:

Object { value: 42280709, detail: "https://covid19.mathdro.id/api/confirmed" } Object { value: 28591681, detail: "https://covid19.mathdro.id/api/recovered" } Object { value: 1145557, detail: "https://covid19.mathdro.id/api/deaths" }

顺便说一句, console.log(confirmed.value) 没有返回任何东西,为什么?

所以我决定使用 Array.prototype.map()

return (
    <div> 
        {this.state.confirmed.map(i => (<div>{i.value}</div>))} 
    </div>);

现在我得到了

TypeError: confirmed is undefined

我不明白这个错误,如果 console.log(confirmed) 未定义,它怎么能返回某些内容?

我探索的其他路径:使用 JSON.parse 、将键放入映射中、删除 {},..

我浏览了几个 stackoverflow 问题,但仍然不明白要更改什么: React 渲染:对象作为 React 子项无效 对象作为 React 子项无效。如果您想要渲染子项集合,请使用数组代替

有什么线索吗?谢谢!

2个回答

我检查了您使用的 API,我发现 confirmed、recovered、deaths 是对象而不是数组( 这就是您收到这些错误的原因 )。您应该执行以下代码。

class App extends Component {
    constructor(props) {
        super(props);
        this.state = { confirmed: {}, recovered: {}, deaths: {} };
      }
    
    async componentDidMount() {
      fetch("https://covid19.mathdro.id/api")
      .then((response) => response.json())
      .then(
          (data) => {
            const { confirmed, recovered, deaths } = data
            this.setState({ confirmed, recovered, deaths });
          }
        );
      }
    
    render() {
        const { confirmed, recovered, deaths } = this.state;
        return (
          <div>
            <div>Confirmed: { confirmed.value || 0}</div>
            <div>Recovered: { recovered.value || 0}</div>
            <div>Deaths: { deaths.value || 0 }</div>
          </div>
        )
    }
}
    
export default App;
Naren
2020-10-24

首先,您无法在 JSX 中呈现对象,它应该是一个有效的 JSX 元素,请查看 ReactNode 类型定义以获取更多信息。

您面临的第二个问题是由于您的初始状态,它是一个带有空数组的对象,名为 data ; this.state = { data: [] }; 。因此,当您尝试访问 this.state.dataconfirmed 属性时;它失败了,因为您的数据还没有从 api 调用中传出来。

您需要做的是在渲染任何内容之前检查 this.state.data 是否具有一个名为 confirmed 的属性。

return (<div>
          {this.state.confirmed && <div> 
            {this.state.confirmed.map(i => (<div>{i.value}</div>))} 
         </div>}
        </div>)
Anuja
2020-10-24