react-chartjs-2を使用して反応し、いくつかのチャートコンポーネントをテストしようとするのが初めてです。私は、更新ボタンを押したときに切り替える2つのテストデータオブジェクトを持っています。ボタンのクリック時にsetState()が状態を更新しない
メインApp
コンポーネントは、Bar
(react-chartjs-2から)とButton
コンポーネントを処理するように設定されています。 state
はBar
に使用するデータオブジェクトを参照し、updated
という変数はhandleUpdate()
メソッドで表示するデータを決定するために使用します。 Button
は、それが小道具にonClick
の基準として渡されるApp
でhandleUpdate()
メソッドを呼び出す必要がクリックされた
。メソッドはupdated
を評価し、setState()
を使用して、使用されているデータを変更します。私はsetState()
のコールバックを使って状態を記録し、updated
の値を変更しています。
import React from 'react';
import ReactDOM from 'react-dom';
import { Bar } from 'react-chartjs-2';
const chart1 = {
labels: ['Team1', 'Team2', 'Team3', 'Team4', 'Team5'],
datasets: [{
label: 'Team points',
data: [503, 385, 270, 133, 65],
backgroundColor: [
'#4DB6AC',
'#E57373',
'#7986CB',
'#F06292',
'#E0E0E0'
]
}]
};
const chart2 = {
labels: ['Team1', 'Team2', 'Team3', 'Team4', 'Team5'],
datasets: [{
label: 'Team points 2',
data: [303, 185, 470, 313, 65],
backgroundColor: [
'#4DB6AC',
'#E57373',
'#7986CB',
'#F06292',
'#E0E0E0'
]
}]
};
class App extends React.Component {
constructor(props) {
super(props);
this.handleUpdate = this.handleUpdate.bind(this);
this.updated = false;
this.state = {
chartData: chart1
}
console.log(this.state.chartData);
console.log(this.updated);
}
// Toggle between chart1 and chart2 based on value of updated
handleUpdate() {
if (!this.updated) {
this.setState({
chartData: chart2
},() => {
console.log(this.state.chartData);
this.updated = true;
});
}
else {
this.setState({
chartData: chart1
},() => {
console.log(this.state.chartData);
this.updated = false;
});
}
}
render() {
return(
<div>
<Bar data={this.state.chartData} width={650} height={400} />
<Button handleOnClick={this.handleUpdate} />
</div>
);
}
}
const Button = (props) => (
<button id="update-chart" onClick={props.handleOnClick}>Update</button>
);
ReactDOM.render(
<App />,
document.getElementById('chart-container')
);
ボタンが意図したとおりにすべての作品をクリックする初めて、状態が更新され、コンポーネントの新しいデータを表示するために再描画します。ただし、それ以降のクリックでは、状態は変わらず、グラフは同じデータを参照し続けます。
console output - 最初のオブジェクトは最初のレンダリングで、その後の2つはボタンをクリックした後に記録されます。ご覧のように、データは最初のボタンのクリックで変更されますが、2回目以降のクリックでは変更されません。
私はsetState()
が非同期であり、バッチ更新が可能であることを知っていますが、最初のクリックではうまく動作し、他のすべてのクリックではうまくいかず、なぜコールバックが呼び出されているのですか? tは変わった。
編集:問題はreact-chartjs-2に関連していると思います。 import
文を削除してBar
コンポーネントをインポートし、代わりにBar
をChartjsとは関係のない通常の関数コンポーネントとして定義すると、App
の状態は各クリックで2つのデータオブジェクト間で正常に変更されます。
したがって、データpropをreact-chartjs-2のBar
コンポーネントに渡すことに関連しているようです。 App
の状態が変わるのをなぜ止めるのか分かりませんが、それはトップレベルのコンポーネントだからです。
Here is a JSFiddleBar
を反応チャート2成分として使用しない場合の作用を示す。
@Ved @Ved @Ved @Ved自分が行っていることをすでに知っている人のために、重複しています。 OPは明らかにしません。 – Andrew
いつでもコンソールに警告やエラーがありますか? – Panther
@Pantherエラーはありません。私は最初のデータオブジェクトは、最初のレンダリングからのコンソール出力の画像を含め、他の2つのオブジェクトは、ボタンのクリックからです。最初のクリックは変更されますが、残りは変更されません。 – SmCTwelve