Первый: если вы хотите изменить состояние компонента, вы должны сделать это, используя функцию this.setState({...})
Реакция, если вы не сделаете это таким образом, реакция не будет запускать сновафункция рендеринга.Поэтому вам нужно изменить способ загрузки данных:
const labels = [];
const data = [];
results.forEach(packet => {
labels.push(new Date(packet.updated).formatMMDDYYYY());
data.push(parseFloat(packet.users));
});
this.setState({
labels,
data
})
Теперь помните, что constructor
просто запускается, как только компонент будет смонтирован, так что если вы установите состояние chart.js
со значениями вРеквизит, когда родительский компонент запустил функцию setState
, ваши данные не будут обновляться.Поэтому здесь нам нужно удалить следующее из constructor
:
chartData: {
labels: props.labels,
datasets: [
{
data: props.data,
backgroundColor: 'rgba(255, 99, 132, 0.6)',
}
]
}
и добавить к функции render
, например:
const chartData = {
labels: props.labels,
datasets: [
{
data: props.data,
backgroundColor: 'rgba(255, 99, 132, 0.6)',
}
]
}
Наконец, отправьте данные, которые вы недавно создали
<Bar
data={chartData}
options={{
title: {
display: true,
text: 'Largest cities in Delhi',
fontSize: 25
},
legend: {
display: true,
position: 'right'
}
}}
/>
Кроме того, поскольку вы используете React
, вы не должны использовать jQuery.Если вы просто используете его для загрузки данных, вы можете использовать другие альтернативы, такие как axios
или fetch
для извлечения данных:)
EDIT
Date
прототип доступен только для чтения, поэтому вы должны создать новую функцию для его форматирования в App.js
:
getFormatDate = (date) => {
return (
date.getDate() + 1 + "/" + date.getMonth() + "/" + date.getFullYear()
);
}
Измените ваш getChartData
с помощью следующего кода, чтобы решитьвыпуск:
getChartData() {
axios.get('https://cors-anywhere.herokuapp.com/https://api.myjson.com/bins/zfpa2')
.then(({ data }) => {
const labels = [];
const dataArray = [];
data.forEach(packet => {
labels.push(this.getFormatDate(new Date(packet.updated)));
dataArray.push(parseFloat(packet.users));
});
this.setState({ data : dataArray, labels })
})
.catch(error => {
console.log(error);
})
}