2014-11-28 9 views
51

Ich möchte meine Komponente nach meiner Ajax-Anfrage gerendert werden.Reactjs Async-Rendering von Komponenten

Im folgenden finden Sie meinen Code

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>) 

     }) 

    } 
}); 

aber ich habe den Fehler unten sehen, weil ich in der getan Methode meiner Ajax-Request machen kehre zurück.

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

Gibt es eine Möglichkeit zu warten, meine Ajax-Anforderung vor dem Start Rendering Ende zu?

+2

Auch ein kleiner Nitpick, aber ein Datenabruf in einer render() - Routine ist nicht wirklich eine großartige Idee. Halten Sie render() für das Rendering und den Rest aus. Außerdem möchten Sie diese Daten möglicherweise nur einmal abrufen, nicht jedes Mal, wenn die Komponente gerendert wird. –

Antwort

90

Es gibt zwei Möglichkeiten, dies zu handhaben. Welche Methode Sie wählen, hängt davon ab, welche Komponente die Daten und den Ladezustand besitzen soll.

  1. die Ajax-Anfrage in die übergeordneten bewegen und macht bedingt die Komponente:

    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. Halten Sie die Ajax-Anfrage in der Komponente und macht etwas anderes bedingt, während es Laden ist:

    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} />; 
        } 
    }); 
    
+4

Ich bin über diese Antwort im Jahr 2017 gestolpert, sind diese beiden besten Lösungen immer noch die besten zu verwenden? – Dan

+0

@Dan React rendert UI basierend auf Requisiten und Status, so dass das Kernkonzept gleich bleibt - die Ajax-Anfrage ausführen, einen Zustand setzen und etwas neu rendern. Muster wie Komponenten höherer Ordnung sind jedoch beliebter geworden und zeigen, wie man die Komplexität abstrahieren kann. –

+0

'if (this.state.data)' sollte 'if (this.state && this.state.data) sein, weil manchmal der Status null sein kann. – Timo

Verwandte Themen