问题
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.
react setstate problem
How can I initialize state with the fetched json.
回答1:
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);
});
}
来源:https://stackoverflow.com/questions/45162840/react-setstate-sets-to-string-instead-of-object