2016-08-03 13 views
3

Только что начал использовать ReactJS и JS, есть ли способ вернуть JSON, полученный из APIHelper.js, в setState dairyList в App.jsx?ReactJS componentDidMount и Fetch API

Я думаю, что я не понимаю что-то фундаментальное в отношении React или JS или обоих. Состояние dairyList никогда не определяется в Facebook React Dev Tools.

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

Является ваш 'APIHelper.js' файл даже синтаксически правильно? После того, как вы это исправите, другое: «APIHelper.fetchFood» является асинхронным. – zerkms

+0

@zerkms Спасибо, только что заметил, что закрывающая скобка для fetchFood была после var url. Есть ли лучший способ получить данные, дождаться ответа и затем перейти оттуда? – Nikkawat

ответ

5

С fetch является асинхронной вам нужно сделать что-то вроде этого:

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

Sweet! Спасибо за ваш ответ, это помогло. – Nikkawat

+0

@ Никкават Отлично! Если вам больше ничего не нужно, нажмите галочку рядом с этим ответом. – Jack

1

Это работает! Сделано в соответствии с ответом Джека, добавлено .bind(this) in componentDidMount() и изменено fetch(url) на return fetch (url)

Спасибо! Теперь я вижу State> dairyList: Array [1041] со всеми элементами, мне нужно

// 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)», это автоматически происходит с помощью «жирной стрелки» ('() => {}' style. – Jack

+0

Без '.bind (this)' Я получаю сообщение об ошибке 'Uncaught (в обещании) TypeError: Невозможно прочитать свойство setState undefined' – Nikkawat

+0

Это интересно. [docs] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) , и мой опыт говорит иначе, но все работает! – Jack