javascript - react.js - 处于异步数据状态的深层对象不起作用

标签 javascript ajax asynchronous reactjs

我刚刚发现 React 状态下有多个子对象的对象不容易渲染。

在我的示例中,我有一个通过 AJAX 与第三方 API 通信的组件:

var Component = React.createClass({
  getInitialState: function () {
    return {data: {}};
  },

  loadTrackData: function () {
    api.getDataById(1566285, function (data) {
        this.setState({data: data});
    }.bind(this));
  },

  componentDidMount: function () {
    this.loadTrackData();
  },

  render: function () {
    return (
        <div>
            <h2>{this.state.data.metadata.title}</h2>
        </div>
    );
  }
});

问题是 {this.state.data.metadata} 渲染正常..

但是 {this.state.data.metadata.title} 抛出错误 Uncaught TypeError: Cannot read property 'title' of undefined!

处理这种异步数据的正确方法是什么?

最佳答案

如果页面有异步操作,我总是喜欢添加加载微调器或指示器。我会这样做

var Component = React.createClass({
  getInitialState: function () {
    return {data: null};
  },

  loadTrackData: function () {
    api.getDataById(1566285, function (data) {
      this.setState({data: data});
    }.bind(this));
  },

  componentDidMount: function () {
    this.loadTrackData();
  },

  render: function () {
    var content = this.state.data ? <h2>{this.state.data.metadata.title}</h2> : <LoadingIndicator />;
    return (
      <div>
      {content}
      </div>
    );
  }
});

加载指示器基本上可以改善用户体验,并且不会带来太多不必要的惊喜。您可以在这里创建自己的加载指示器组件,其中有很多选择 http://loading.io/

关于javascript - react.js - 处于异步数据状态的深层对象不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27875906/

相关文章:

Javascript清除选择框的内容

Javascript - 重定向到带有 POST 数据的页面

php - 同一页面上的 Ajax 到 PHP

angularjs - Angular UI Bootstrap Typeahead - 未显示异步结果

java - 必须为元素类型 "xmlns"声明属性 "beans"

javascript - 任意 JS/HTML 上传的 Web 安全

javascript - 获取点击事件的ui元素信息

javascript - IE Bug (window === top) === false

javascript - 有没有办法通过 AJAX 从客户端 JavaScript 代码调用服务器端 Groovy 对象方法?

node.js - 是否可以在nodejs Async( waterfall ,系列等...)中构建动态任务列表