Reputation: 99
I am trying to fetch a big json file when the webpage has been loaded and then update react state with that data.
Currently, I have this code
get(url) {
return new Promise((resolve, reject) => {
const req = new XMLHttpRequest();
req.open('GET', url);
req.onload = () => req.status === 200 ? resolve(req.response) : reject(Error(req.statusText));
req.onerror = (e) => reject(Error(`Network Error: ${e}`));
req.send();
});
}
componentDidMount(){
this.get('https://x.com/data/tool.json').then((response) =>{
this.setState({"sections" : response});
console.log(this.state);
}).catch((err) =>{
console.log(err);
});
}
The code sets sections to a sting as shown in the screenshot instead of the actual json object.
How can I initialize state with the fetched json.
Upvotes: 0
Views: 1715
Reputation: 733
Firstly I would recommend using the fetch library instead of Promises and XMLHttpRequest. If you need to support IE 11 and below, you can use a polyfill
Sticking with your code though, at no point do you appear to use JSON.parse
on your response
, to turn the JSON string you get back into a JavaScript object.
this.setState({"sections" : JSON.parse(response)});
This would be much easier and cleaner with fetch
though I feel,
componentDidMount(){
fetch('https://abx.com/data/tool.json').then(response =>{
if (!response.ok) throw Error('Response not ok')
return response.json(); // This is built in JSON.parse wrapped as a Promise
}).then(json => {
this.setState({"sections" : json});
}).catch(err =>{
console.log(err);
});
}
Upvotes: 3