Javascript 新的反应-使用Fetch
我刚开始学习反应,所以请记住这一点。我试图使用fetch从公共api中提取数据,然后将其放在setState中的“label”部分。我使用的是chart.js,所以我正在寻找一个标签,以便根据api将纽约市的五个行政区纳入其中。问题在于fetch和setState之间的数据传输。我能很好地获取数据。我已经尝试了一些方法,非常感谢您的帮助Javascript 新的反应-使用Fetch,javascript,reactjs,fetch,Javascript,Reactjs,Fetch,我刚开始学习反应,所以请记住这一点。我试图使用fetch从公共api中提取数据,然后将其放在setState中的“label”部分。我使用的是chart.js,所以我正在寻找一个标签,以便根据api将纽约市的五个行政区纳入其中。问题在于fetch和setState之间的数据传输。我能很好地获取数据。我已经尝试了一些方法,非常感谢您的帮助 constructor(){ super(); this.state = { chartData:{}, } } componentWil
constructor(){
super();
this.state = {
chartData:{},
}
}
componentWillMount(){
this.getChartData();
}
getChartData(){
// Ajax calls here
fetch("https://data.cityofnewyork.us/resource/27iv-9uub.json")
.then(response => response.json())
.then(data => {
// eslint-disable-next-line
let boroughs = data.map((data) => {
console.log(data.borough);
return data.borough;
})
console.log(boroughs);
return boroughs;
})
.catch(() => {
console.log("Promise Rejected");
});
let labels = boroughs;
console.log(labels, 'test');
this.setState({
chartData:{
labels: labels,
datasets:[
{
label:'Population',
data:[
617594,
1810450,
153060,
106519,
105162
],
backgroundColor:[
'rgba(255, 99, 132, 0.6)',
'rgba(54, 162, 235, 0.6)',
'rgba(255, 206, 86, 0.6)',
'rgba(75, 192, 192, 0.6)',
'rgba(153, 102, 255, 0.6)',
'rgba(255, 159, 64, 0.6)'
]
}
]
}
});
}
在这种特殊情况下,
this.setState
需要在承诺成功时接收数据的then
内部调用
比如说:
fetch("https://data.cityofnewyork.us/resource/27iv-9uub.json")
.then(response => response.json())
.then(data => {
this.setState({...});
return data;
})
.catch(() => {
console.log("Promise Rejected");
});
这里最基本的问题是,在
回调中解决承诺之前,您没有自治区。将这一行放入构造函数
this.getChartData = this.getChartData.bind(this);
您应该在API调用的then函数
中设置状态,在进行ajax调用时使用componentDidMount()
lifecycle钩子是一种很好的做法
constructor(){
super();
this.state = {
chartData:{},
}
}
componentDidMount(){
this.getChartData();
}
getChartData(){
// Ajax calls here
fetch("https://data.cityofnewyork.us/resource/27iv-9uub.json")
.then(response => response.json())
.then(data => {
// eslint-disable-next-line
let boroughs = data.map((data) => {
console.log(data.borough);
return data.borough;
})
this.setState({
chartData:{
labels: boroughs,
datasets:[
{
label:'Population',
data:[
617594,
1810450,
153060,
106519,
105162
],
backgroundColor:[
'rgba(255, 99, 132, 0.6)',
'rgba(54, 162, 235, 0.6)',
'rgba(255, 206, 86, 0.6)',
'rgba(75, 192, 192, 0.6)',
'rgba(153, 102, 255, 0.6)',
'rgba(255, 159, 64, 0.6)'
]
}
]
}
});
})
.catch(() => {
console.log("Promise Rejected");
});
}
最好将API调用移动到componentDidMount
而不是componentWillMount
。迈克,谢谢你的回复。如果不在承诺范围内,你会建议什么时候设立自治区?@BrianS,答案要长一点。一般来说,我建议使用redux
,然后利用redux承诺中间件
之类的工具来处理承诺内部可能出现的挂起
、履行
和拒绝
状态。这还需要将组件连接到redux
。我想说的是,如果你没有因为特定的原因而使用redux
,那么你唯一的选择就是在分辨率范围内使用它。太棒了,非常感谢。我还没有涉足redux,因为我刚刚开始使用react。我将进一步研究该解决方案。嘿,执行此操作后,我的渲染函数无法知道this.state.chartData的状态。有什么原因吗?你能分享你的render
功能吗?