我正在从 API 接收数据,我想获取这些数据并让它填充我的图表。我可以看到 API 数据被调用并被传递到 setState 的位置,但我似乎无法正确获取这些数据并将其传递给我的图表。
我尝试使用 Chart.js 的 destroy(( 和 update(( 方法无济于事。我敢肯定,这只是我没有在我的应用程序中正确使用它们的问题。下面的代码不包括这些方法,因为我不确定在哪里使用它们。我也尝试将 API 数据推送到图表的数据数组中,但没有运气。
componentDidMount() {
// create chart
new Chart(myChartRef, {
type: "line",
data: {
labels: ["Jan", "Feb", "March"],
datasets: [
{
data: this.state.chartData,
backgroundColor: gradient,
pointBackgroundColor: "#fff",
pointBorderColor: gradient,
pointRadius: "5",
hoverBackgroundColor: "#75C6FF",
hoverBorderColor: gradient
}
]
},
options: {
responsive: true,
legend: {
display: false
},
scales: {
xAxes: [
{
gridLines: {
color: "#535356"
},
ticks: {
fontColor: "#87889C"
}
}
],
yAxes: [
{
gridLines: {
color: "#535356"
},
ticks: {
fontColor: "#87889C"
}
}
]
}
}
});
/* fetch API data and use it to set app state (setState) */
const getChartData = () => {
fetch(
"https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH&tsyms=USD"
)
.then(response => {
return response.json();
})
.then(myJson => {
const bitcoinPrice = myJson.BTC.USD;
this.setState({ chartData: bitcoinPrice });
console.log(JSON.stringify(myJson));
});
};
getChartData();
}
在代码中,一旦组件挂载,我就会创建一个新图表。然后我调用 API 并接收我要在图表上显示的数据。我可以在 React 开发工具中看到正在我的应用程序中设置状态,但图表没有更新。我假设我需要做一些事情,例如将 API 数据映射到图表中的数据数组中,但我不确定如何正确执行此操作,并且我对 SO 或其他在线任何地方建议的其他解决方案没有运气。
这是我的第一个 React 应用程序,所以我不确定我在 React 还是 Chart 中做错了什么.js?
根据我的经验,您可以将图表组件和图表容器分开。在图表容器中进行提取,并将获取的数据作为道具传递给图表组件,以便更好地组织代码。
您还需要检查 props 是否在图表组件内使用 componentWillReceiveProps 生命周期方法更改,并相应地更新图表
- 创建一个名为 ChartContainer 的组件.js并将 chartData 作为 props 传递给 ChartComponent
import React, { Component } from 'react';
import ChartComponent from './ChartComponent'
export class ChartContainer extends Component {
constructor(props) {
super(props);
this.state = {
chartData: []
}
componentDidMount() {
fetch(
"https://min-api.cryptocompare.com/data/pricemulti?fsyms=BTC,ETH&tsyms=USD"
)
.then(response => {
return response.json();
})
.then(myJson => {
const bitcoinPrice = myJson.BTC.USD;
this.setState({ chartData: bitcoinPrice });
console.log(JSON.stringify(myJson));
});
}
render() {
const { chartData } = this.state;
return (
<ChartComponent chartData={chartData}/ >
);
}
}
- 创建一个名为 ChartComponent 的组件并获取 chartData 作为 props。还要创建一个名为图表的状态,并将图表设置为状态,并使用组件WillReceiveProps生命周期更新图表以更新图表。
import React, { Component } from 'react';
export class ChartComponent extends Component {
constructor(props){
super(props)
this.state = { chart : null }
}
chart = React.createRef();
componentDidMount(){
// pass chartData to Chart below as this.props.chartData
let theChart = new Chart(...)
// set chart to state
this.setState({ chart: theChart })
}
componentWillReceiveProps(nextProps, nextContext) {
// update chart according to prop change
this.state.chart.data.datasets.forEach((dataset) => {
dataset.data.push(nextProps.chartData);
});
this.state.chart.update();
}
render(){
return (
<canvas id="myChart" ref={this.chart} />
);
}
};
当道具更改时,图表组件不会刷新。要使其工作,请使用重绘={true}
<ChartComponent type={chartType} {...someConfig} redraw={true}/>