【问题标题】:Render API response with React.js使用 React.js 呈现 API 响应
【发布时间】:2018-09-01 07:42:58
【问题描述】:

我正在尝试呈现我创建的简单 api 的响应,但是当我尝试遍历项目时,它是未定义的。我知道它与异步编程有关,但不知道如何解决它。有人可以帮忙吗?

import React from 'react';

export default class Home extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            items: undefined
        };
    }
    componentDidMount() {
        fetch('https://petzie-cajuhqnpqy.now.sh/breeds')
        .then(res => res.json())
        .then(data => {
            this.setState(() => {
                return {
                    items: data.result
                };
            });
            console.log(this.state);
        })
        .catch(err => console.log(err));
    }
    render() {
        return (
            <div>    
                { this.state.items.map((item) => {
                    return <p>{item.name}</p>;
                }) }         
            </div>
        );
    }
}

【问题讨论】:

    标签: javascript reactjs iteration


    【解决方案1】:

    如果您有异步调用,您需要执行以下操作:

    render() {
        if(!this.state.items) { 
            return <div></div> 
        }
        return (
            <div>    
                { this.state.items.map((item) => {
                    return <p>{item.name}</p>;
                }) }         
            </div>
        );
    }
    

    是一种方法。

    【讨论】:

    • 您忘记了! 之前的this.state.items。无论如何,如果您最初将this.state.items 设置为[],则没有必要这样做。在空数组上调用 map() 不会做任何事情。
    • 感谢您的提示。是的,这也是可能的
    【解决方案2】:

    首先,如果你要去.mapthis.state.items,它不能在任何时候undefined,否则你会抛出一个错误(.map需要一个数组)。因此,在您的构造函数中,将其定义为一个空数组:

    constructor(props) {
        super(props);
        this.state = { items: [] };
    }
    

    其次,setState 是异步的。因此,当您紧跟其后调用setStatethis.state 时,对象尚未更新。但是由于 React 的特性,每当它被更新时,你的渲染函数都会被再次调用,这一次 this.state.items 将从 API 获取数据。

    【讨论】:

    • 非常感谢 Rafael,这是我必须做的唯一改变才能让它工作。也感谢 setState 的建议。干杯!
    • 不客气。请接受答案以供将来参考。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2019-08-08
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多