我想在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请求结束?

推荐答案

有两种方法可以处理这个问题, Select 哪种方法取决于哪个组件应该拥有数据和加载状态.

  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>;
      }
    });
    
  2. 将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} />;
      }
    });
    

Reactjs相关问答推荐

如何使用mui为可重复使用的react 按钮应用不同的风格

可选链和useState挂钩

在一个blog函数中调用setState钩子

Next.js:提交表单时状态尚未就绪

如何在单击行中的图标时避免选中ionic 复选框?

NextJS如何正确保存添加到购物车中的产品会话

同一文件中前端和后端的Nginx配置

在React中映射对象数组时,如何正确呈现JSX.Element或React.ReactNode类型?

shadcn输入+窗体+Zod;一个部件正在改变要被控制的不受控制的输入;

使用 React + Vite 范围化 CSS

React 在第一次渲染时为 null

使用D3.js绘制和展示弦图的右下方象限

为什么这个 React 组件会导致无限渲染?

cypress `cy.now()` Type 'Promise' 没有调用签名

如何在 Next Js 13 App Router 中添加 Favicon 图标?

map 未显示在react 传单中

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

为什么此代码中的 useState 不更新(文本更新但 id 不更新)?

React useEffect hooks return () => cleanup() vs return cleanup

React Router 6,一次处理多个搜索参数