当前位置: 首页 > 面试题库 >

ReactJS组件的异步渲染

壤驷茂实
2023-03-14
问题内容

我想在我的ajax请求完成后呈现我的组件。

在下面您可以看到我的代码

var CategoriesSetup = React.createClass({

    render: function(){
        var rows = [];
        $.get('http://foobar.io/api/v1/listings/categories/').done(function (data) {
            $.each(data, function(index, element){
                rows.push(<OptionRow obj={element} />);
            });
           return (<Input type='select'>{rows}</Input>)

        })

    }
});

但是我收到下面的错误,因为我正在ajax请求的done方法内返回render。

Uncaught Error: Invariant Violation: CategoriesSetup.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.

有没有办法在开始渲染之前等待我的ajax请求结束?


问题答案:

有两种处理方法,您可以选择哪种方法取决于应该拥有数据的组件和加载状态。

  1. 将Ajax请求移至父级并有条件地渲染该组件:
        var Parent = React.createClass({
      getInitialState: function() {
        return { data: null };
      },

      componentDidMount: function() {
        $.get('http://foobar.io/api/v1/listings/categories/').done(function(data) {
          this.setState({data: data});
        }.bind(this));
      },

      render: function() {
        if (this.state.data) {
          return <CategoriesSetup data={this.state.data} />;
        }

        return <div>Loading...</div>;
      }
    });
  1. 将Ajax请求保留在组件中,并在加载时有条件地渲染其他内容:
        var CategoriesSetup = React.createClass({
      getInitialState: function() {
        return { data: null };
      },

      componentDidMount: function() {
        $.get('http://foobar.io/api/v1/listings/categories/').done(function(data) {
          this.setState({data: data});
        }.bind(this));
      },

      render: function() {
        if (this.state.data) {
          return <Input type="select">{this.state.data.map(this.renderRow)}</Input>;
        }

        return <div>Loading...</div>;
      },

      renderRow: function(row) {
        return <OptionRow obj={row} />;
      }
    });


 类似资料:
  • 非常简单的例子:我的App.js文件读取 我的Test.js文件上写着 在控制台中,渲染总是打印两次。为什么啊?

  • 所以我基本上已经一周大了,已经好几年没有写任何javascript代码了。所以请原谅我的无知。 问题我创建了三个不同的组件类 //其余的代码和函数 类似地,我有一个类似的类,叫做ClientSignedDate和验证日期,所有这些都包含基本相同的输入道具,但从同一个表的不同列获取数据。 在一个名为Filter的单独父类中,我在这个类中创建了这些组件的数组 const dateOptions=[Cr

  • 问题内容: 我有以下组成部分: article_list.jsx 尽管JSON请求工作正常,并且返回了包含五个JSON对象的数组,但它们只是不呈现! 我是ReactJS的新手,并且阅读(并观看了)很多教程,但是似乎我缺少一些东西。 有什么建议? 问题答案: forEach中的return语句不返回值,而是像语句一样,您需要使用map 否则,如果要使用forEach,则需要修改代码,例如

  • 问题内容: 我试图通过对象属性(此示例的名称)并在函数的轻松循环中列出它们。我发现这样做有些尴尬,但这似乎不正确。 这是我得到的: 有一个更好的方法吗?我只需要一个循环即可遍历对象数组,列出所需的属性并创建许多html节点之一。 问题答案: 您可以简单地在数组上 映射

  • MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议,已经成为物联网的重要组成部分。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。

  • 问题内容: 快速提问。我正在学习React JS。 创建组件时,我们在render函数中提供要渲染的组件的html模板。到目前为止,我只看到带有很少部分html的小型组件,但是我只是想知道如果我们的组件带有巨大的html模板会发生什么情况,有没有办法提供指向单独的html文件的路径?还是我们被迫直接在render函数中编写所有html?谢谢! 问题答案: 您应该始终将其编写在render函数中。您