2016-08-03 5 views
3

ReactJSとJSの使用を開始したばかりですが、APIHelper.jsから取得したJSONをApp.jsxのsetState dairyListに戻す方法はありますか?ReactJS componentDidMountとFetch API

私はReactやJS、あるいはその両方について基本的な何かを理解していないと思います。 dairyListの状態は、FacebookのReact Dev Toolsでは定義されません。 fetch以来

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

を必要とするすべての要素を持つ配列[1041]も、文法的に正しい、あなたの 'APIHelper.js'ファイルですか?あなたがそれを修正した後、別のもの: 'APIHelper.fetchFood'は非同期です。 – zerkms

+0

@zerkmsありがとうございます。ちょうどfetchFoodの閉じ括弧がvar urlの後にあることに気付きました。データを取得し、応答を待ってからそこに行くより良い方法はありますか? – Nikkawat

答えて

5

は、あなたがこのような何かを行う必要があります非同期(async)です:

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

甘い!あなたの答えを助けてくれてありがとう。 – Nikkawat

+0

@Nikkawat素晴らしい!何もない場合は、この回答の横にあるチェックマークをクリックしてください。 – Jack

1

それは働きます! Jackの答えに従って変更し、componentDidMount()内に.bind(this)を追加し、fetch(url)return fetch (url)に変更しました

ありがとう!私は今> dairyListを参照してください。私は

// 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、 '.bind(this)'は必要ありません。これは自動的に "太い矢印"( '()=> {}'スタイルで行われます) – Jack

+0

'.bindなし ' (promise)TypeError:未定義の 'setState'プロパティを読み取れません。 – Nikkawat

+0

これは興味深いです。[docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)私の経験はそうではないと言いますが、何が効いても! – Jack

関連する問題