javascript - 如何在 React 中使用 async/await 等待数据完成获取

标签 javascript reactjs redux jsx

我自己对问题的回答有效,我的回答中包含的 Pedrag 评论也有效

我正在进行一个 http 请求调用,在 http 响应返回之前不想显示该页面(请求调用是 getRoadmaps)。我有一个名为“loading”的 redux 状态来确定响应是否返回了?关于如何在我的代码中实现它的任何见解?我的其他 redux 状态是路线图,其中包含一个也称为路线图的对象(抱歉造成混淆)。

附言我看到了一些说要做的答案(伪代码):如果没有加载显示加载屏幕,否则在渲染中加载正常屏幕。但是我的问题不存在于渲染中,而是存在于我做的 componentWillMount() 中

this.props.getRoadmaps() 

然后 3 行之后我做的

console.log(this.displayRoadmap[0].roadmap[0])

如果 getRoadmaps() 完成,应该会成功记录路线图,似乎调用了 getRoadmaps() 但随后程序继续运行,但 getRoadmaps() 没有完全完成,这导致我的 displayRoadmap 未定义。这也会导致一些奇怪的现象,比如如果我从一个屏幕进入这个组件它总是有效但如果我刷新页面它不起作用

import React, { Component } from "react";
import Tree from "./Tree";
import TreeSidebar from "./TreeSidebar";
import { withRouter } from "react-router-dom";
import { connect } from "react-redux";
import { getRoadmaps } from "../actions/roadmapAction";
class OneRoadmap extends Component {
  constructor(props) {
    super(props);
    this.state = {
      loading: this.props.roadmap.loading,
      roadmapName: "click a white circle to show more!",
      roadmapImg:
        "https://cdn3.iconfinder.com/data/icons/harmonicons-06/64/plus-circle-512.png",
      roadmapDetail: [{ text: "Click on something" }, { text: "hi" }],
      treeData: //deleted,just the default big json object
   };
  }

  componentWillMount() {
    this.props.getRoadmaps();

    var location1 = this.props.location.pathname;
    var n = location1.slice(9);

    var current_roadmaps = this.props.roadmap.roadmaps;

    this.displayRoadmap = current_roadmaps.filter(
      eachRoadmap => eachRoadmap._id == n
    );
    // now we have a roadmap
    console.log(this.displayRoadmap[0].roadmap[0]);
    this.setState({ treeData: this.displayRoadmap[0].roadmap[0] });
    console.log("is good");
    console.log(this.props.loading);
  }

  componentDidMount() {}

  handle_on_click_change = d => {
    this.setState({ roadmapName: d.data.name });
    this.setState({ roadmapImg: d.data.img });
    if (d.data.details == undefined) {
      this.setState({
        roadmapDetail: [{ text: "The author did not put anything here" }]
      });
    } else {
      this.setState({ roadmapDetail: d.data.details });
    }
  };

  render() {
    return (
      <div>
        {console.log(this.state.loading)}
        <ul>
          <li styles={{ float: "left" }}>
            <div>
              {console.log(this.state.treeData)}
              <Tree
                on_click_change={this.handle_on_click_change}
                roadmapData={this.state.treeData}
              />
            </div>
          </li>
          <li styles={{ float: "right" }}>
            <div>
              <TreeSidebar
                displayName={this.state.roadmapName}
                displayImg={this.state.roadmapImg}
                displayDetail={this.state.roadmapDetail}
              />
            </div>
          </li>
        </ul>
      </div>
    );
  }
}

const mapStateToProps = state => ({
  roadmap: state.roadmap
});

export default connect(
  mapStateToProps,
  { getRoadmaps }
)(OneRoadmap);

最佳答案

就我个人而言,我是如何做到这一点的 我使用 CSS 样式 我不知道这是否是最好的方法,但它对我有用,我会做这样的事情

 this state = {
      loaderStyle: 'block',
      contentStyle: 'none'
 }
componentDidMount() {
    If(this.displayRoadmap[0].length > 0) {
       this.setsState({loaderStyle: 'none', contentStyle: 
          'block:
    } else /// do something

};

在我的渲染函数中,我会这样做

 <Loader style={{display: this.state.loaderStyle}}/>

 <Content style={{display: this.state.contentStyle}}>. 
 </Content>

关于javascript - 如何在 React 中使用 async/await 等待数据完成获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54395412/

相关文章:

javascript - jQuery 对象内存大小

javascript - 如何更改 iOS 网站的视口(viewport)?

javascript - React Native Redux 中不可变的 action.payload

javascript - React Router 在后退按钮上重复路由

javascript - 如何在 React Native 中启用 Android 监视器以检查日志?

javascript - 无法在 React 中使用扩展运算符更新状态

javascript - 这总是有效吗?以及可以改进吗?

asp.net - 用户控制从内容页面的母版页访问 Javascript

javascript - React 应用程序,在运行时更改应用程序上下文

javascript - react : Calling Render() during animation. 会发生什么?