2016-10-08 5 views
1

Ich versuche, einen einfachen AJAX-Aufruf mit Axios in React durchzuführen, aber ich kann nicht herausfinden, wo ich falsch liege.Axios AJAX-Aufruf in React, der nur den Anfangszustand zurückgibt

Hier ist, was ich bisher habe (in meiner Komponente):

ComponentDidMount() { 
    axios.get('https://jsonplaceholder.typicode.com/users') 
     .then(res => { 
     const users = res 
     this.setState({ users }); 
     }); 
} 

render() { 
    console.log(this.state.users) // returns the **initialised EMPTY array** 
    return (
    <div> 
     {this.state.users.map(user => <p>{user.name}</p>)} // returns nothing 
    </div> 
    ) 
} 

ich an der URL ein einfaches Array am Zugriff auf in der .get() Methode gegeben (check it out, es ist Struktur, wenn nötig, um zu sehen). Ich kette dann auf die Versprechen und übergeben Sie das res Argument in einer Pfeilfunktion.

Dann weise ich die users Variable dem Ergebnis zu und versuche, den Zustand als dies zu setzen. Also an dieser Stelle erwarte ich, dass this.state.users dem resultierenden Array gleich ist.

jedoch ...

A) Wenn ich console.log (this.state.users) versuchen, es gibt die initialisierten leeres Array

B) Wenn ich versuche, eine Karte des machen Array, Iterieren durch die Eigenschaft name auf jedem Objekt, wieder nichts.

Wohin gehe ich falsch?

Antwort

2

Ein Teil aus dem Typo (wie Phi Nguyen angegeben), ein paar andere Dinge zu beheben:

1) Axios das Versprechen mit einem Antwortobjekt löst. So die Ergebnisse zu erhalten was Sie tun müssen:

axios.get('https://jsonplaceholder.typicode.com/users') 
    .then(res => { 
     const users = res.data; // Assuming the response body contains the array 
     this.setState({ users }); 
    }); 

Schauen Sie sich die Dokumentation über das Response-Objekt hier: https://github.com/mzabriskie/axios#response-schema

2) Wenn es eine Ausnahme (Ihre Anforderung fehlschlägt) Sie es wahrscheinlich zu handhaben wollen statt es zu schlucken. Also:

axios.get('https://jsonplaceholder.typicode.com/users') 
    .then(res => { 
    const users = res.data; // Assuming the response body contains the array 
    this.setState({ users }); 
    }) 
    .catch(err => { 
     // Handle the error here. E.g. use this.setState() to display an error msg. 
    }) 
+0

Das hat funktioniert - danke. Ich bin ein wenig verwirrt - wenn ich die Ergebnisse "console.log" gebe, werden zwei Werte zurückgegeben: '[]' und das erwartete Array von der API. Dies kann vermutlich dadurch erklärt werden, dass der Zustandswert einmal bei der Initialisierung zurückgegeben wird und dann wieder mit componentDidMount. Wenn ich versuche, auf ein einzelnes Objekt im Array zuzugreifen, zum Beispiel 'this.state.users [0]', versucht es auf das leere Array zuzugreifen. Ich kann nur dazu kommen, indem ich durch das Array mappe. Gibt es eine Möglichkeit, den aktualisierten Wert "this.state.users" jedes Mal zu targeten und zu vermeiden, dass der ursprüngliche Zustandswert abgerufen wird? – Paulos3000

+0

Jedes Mal, wenn Sie this.setState aufrufen, wird die Rendermethode erneut aufgerufen, um den neuen Status der Komponente wiederzugeben. Sehen Sie sich dieses Diagramm hier an: http://imgh.us/react-lifecycle.svg Sie haben also ein initiales Rendering (wenn Benutzer nicht initialisiert sind), dann haben Sie ein zweites nach componentDidMount und ein drittes nachdem Sie setState (at Dieser Punkt haben Sie die Liste der Benutzer). Sie können die Liste in Ihrem Komponentenkonstruktor initialisieren. Normalerweise können Sie in der Render-Methode überprüfen, ob '' 'this.state.users''' leer ist und einen Loader oder etwas anzeigt. –

2

typo. Es sollte componentDidMount anstelle von ComponentDidMount sein.

Verwandte Themen