2016-08-03 30 views
3

Gerade erst mit ReactJS und JS, gibt es eine Möglichkeit, die JSON von APIHelper.js zu SetState MolkereiList in App.jsx zurückgeben?ReactJS componentDidMount und Fetch-API

Ich glaube, ich verstehe etwas grundlegend über React oder JS oder beides. Der Status "molkereiListe" ist in Facebook React Dev Tools nicht definiert.

// App.jsx 
export default React.createClass({ 
    getInitialState: function() { 
    return { 
     diaryList: [] 
    }; 
    }, 
    componentDidMount() { 
    this.setState({ 
     dairyList: APIHelper.fetchFood('Dairy'), // want this to have the JSON 
    }) 
    }, 
    render: function() { 
    ... 
    } 


// APIHelper.js 
var helpers = { 
    fetchFood: function(category) { 
    var url = 'http://api.awesomefoodstore.com/category/' + category 

    fetch(url) 
    .then(function(response) { 
     return response.json() 
    }) 
    .then(function(json) { 
     console.log(category, json) 
     return json 
    }) 
    .catch(function(error) { 
     console.log('error', error) 
    }) 
    } 
} 

module.exports = helpers; 
+0

Ist Ihr 'APIHelper.js' Datei auch syntaktisch korrekt brauchen? Nachdem Sie es behoben haben, ist eine andere Sache: 'APIHelper.fetchFood' ist asynchron. – zerkms

+0

@zerkms Danke, habe gerade die schließende Klammer für fetchFood bemerkt, war nach var url. Gibt es eine bessere Möglichkeit, die Daten abzurufen, auf die Antwort zu warten und dann von dort zu gehen? – Nikkawat

Antwort

5

Seit fetch ist async Sie etwas tun müssen werden:

componentDidMount() { 
    APIHelper.fetchFood('Dairy').then((data) => { 
    this.setState({dairyList: data}); 
    }); 
}, 
+0

Süß! Danke für deine Antwort, es hat geholfen. – Nikkawat

+0

@Nikkawat Großartig! Wenn es sonst nichts gibt, klicken Sie auf das Häkchen neben dieser Antwort. – Jack

1

Es funktioniert! Änderungen nach Jacks Antwort vorgenommen, .bind(this) in componentDidMount() hinzugefügt und geändert fetch(url) zu return fetch (url)

Vielen Dank! Ich sehe jetzt Staat> dairyList: Array [1041] mit allen Elementen I

// App.jsx 
export default React.createClass({ 
    getInitialState: function() { 
    return { 
     diaryList: [] 
    }; 
    }, 
    componentDidMount() { 
    APIHelper.fetchFood('Dairy').then((data) => { 
     this.setState({dairyList: data}); 
    }.bind(this)); 
    }, 
    render: function() { 
    ... 
    } 


// APIHelper.js 
var helpers = { 
    fetchFood: function(category) { 
    var url = 'http://api.awesomefoodstore.com/category/' + category 

    return fetch(url) 
    .then(function(response) { 
     return response.json() 
    }) 
    .then(function(json) { 
     console.log(category, json) 
     return json 
    }) 
    .catch(function(error) { 
     console.log('error', error) 
    }) 
    } 
} 

module.exports = helpers; 
+2

FWIW, Du solltest '.bind (this)' nicht brauchen, das geschieht automatisch mit dem "fetten Pfeil" ('() => {}' style. – Jack

+0

Ohne '.bind (this)' bekomme ich einen Fehler 'Uncaught (in Aussicht) TypeError: Kann die Eigenschaft 'setState' von 'undefined' nicht lesen – Nikkawat

+0

Das ist interessant. Die [docs] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) und meine Erfahrung sagt etwas anderes, aber was auch immer funktioniert! – Jack

Verwandte Themen