reactjs - 如何在 React 上呈现异步内容?

标签 reactjs asynchronous promise async-await

我正在构建一个基于 WP API 的 SPA,并希望同时呈现帖子及其特色图片,但它们来自不同的端点。

渲染时,React 不等待请求解决并收到错误:“未捕获的不变违规:对象作为 React 子项无效(已找到:[object Promise])。”

完全是 Promise 和 Async/Await 函数的初学者。甚至不知道我是否正确使用它。

import React, { Suspense, Component } from "react";
import { FontSizes, FontWeights, PrimaryButton, DefaultButton } from 'office-ui-fabric-react';
import axios from "axios";
import './Home.styl'

class Home extends Component {
    constructor() {
      super();

      this.state = {
        posts: []
      }
    }

    componentWillMount() {

      this.renderPosts();

    }

    renderPosts() {

      axios.get('https://cors-anywhere.herokuapp.com/https://sextou.didiraja.net/wp-json/wp/v2/posts')
      .then((response) => {
        // console.log(response)

        this.setState({
          posts: response.data,
        })
      })
      .catch((error) => console.log(error))

    }

    async getImg(mediaId) {

      const getImg = axios
        .get('https://cors-anywhere.herokuapp.com/https://sextou.didiraja.net/wp-json/wp/v2/media/17')
        .then((response) => {
          return {
            url: response.data.source_url,
            alt: response.data.alt_text,
          }
        })

      const obj = getImg

      return (
        <img src={obj.url} />
      )

    }

    render() {

      const { posts } = this.state

      return (
        <span className="Home-route">

        <h1 style={{textAlign: 'center'}}>Sextou!</h1>

          <div className="events-wrapper">
            {
              posts.map((post, key) => {
                return (
                <div className="event-card" key={key}>

                  <img src={this.getImg()} />

                  <h2
                    className="event-title"
                    style={{ fontSize: FontSizes.size42, fontWeight: FontWeights.semibold }}
                  >
                    {post.title.rendered}
                  </h2>

                  {post.acf.event_date}

                  <span>{post.excerpt.rendered}</span>

                  <a href={post.acf.event_link} target="_blank">
                    <DefaultButton
                      text="Acesse o evento"
                    /> 
                  </a>

                  <a href={post.acf.event_ticket} target="_blank">
                    <PrimaryButton
                      text="Comprar ingressos"
                    /> 
                  </a>

                </div>

                )
              })
            } 
          </div>


        </span>
      );
    }
  }
  export default Home;

最佳答案

您可以像获取帖子一样获取图像:

将它们包含在您的状态

this.state = {
  posts: [],
  image: null
};

componentWillMount中调用getImage

componentWillMount() {
  this.getPosts();
  this.getImage();
}

setState 当 promise 解析时:

.then(response => {
  this.setState(state => ({
    ...state,
    image: {
      url: response.data.source_url,
      alt: response.data.alt_text
    }
  }));
});

显示加载屏幕或微调器直到图像加载

render() {

  const { posts, image } = this.state;

  if (!image) {
    return "Loading";
  }

  // ...
}

我还建议使用 componentDidMount 而不是 componentWillMount,因为 componentWillMount is deprecated and is considered unsafe.

这是一个 codesandbox example .

关于reactjs - 如何在 React 上呈现异步内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58293999/

相关文章:

javascript - 使用 promise 中的 Prop

javascript - 在将它们的返回数据用于另一个函数调用之前,如何等待多个 promise 全部完成?

reactjs - 如何使用create-react-app开发多个页面?

javascript - AngularJs:返回嵌套 $http 的 promise - 已经找到解决方案,但为什么它有效?

reactjs - 在功能 react 组件中无限重新渲染

asynchronous - 如何识别异步串行位流中的起始位

Javascript 函数更有效地处理并发异步函数

javascript - 手动更改 DOM,而不是依赖 React 的协调

javascript - 父组件或子组件应该在 React 中获取数据吗?

java - Play Framework 2.4.x 在回调函数中执行保存操作