質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

1019閲覧

ReactでChart.jsを使い、グラフのdataを動的にしたい

yasso

総合スコア6

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/12/28 17:24

編集2020/12/28 17:28

前提・実現したいこと

結論はボタンをクリックすると、レーダーチャートのデータ(数値)と、Level.0の部分の数値が連動するようにしたいです。(画像を参考にしていただきたいです。)

今、勉強の一環としてReactでちょっとしたアプリをつくっています。
綺麗なグラフがかけるChart.jsというライブラリーを使用しました。

つまづいているところは、ボタン(コードではLevelコンポーネント内の<button>)をクリックすると、レーダーチャートのデータ(コード内ではChartコンポーネント内のdata)と、Levelの数値(コードではLevelコンポーネント内の<p>タグ内の{this.state.count})が連動するようにしたいのですがどう書いたらいいか分からず困っています。

実現したいのは、English Speakingのボタンを押すと、その下のLevel.0の0の部分の数値が変わり、同時にレーダーチャート内のEnglish Speakingの数値も変わるというものです。(それぞれのカテゴリーも実装したい。)

ボタンを押すと、Level.0の0の数値が変わるというものは実装できましたが、レーダーチャートの数値も連動させるということはできませんでした。

該当のソースコード

コードの表示(インライン)
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import { Radar } from 'react-chartjs-2';

class Chart extends React.Component {
constructor() {
super()
this.state={

}
}
render() {
const data = {
labels: ['English Speaking', 'English Listening', 'English Reading(CNN)', 'Programming Coding', 'Training for strongth', 'health'],
datasets: [
{
label: "",
data: [0,0,0,0,0,0],
backgroundColor: "rgba(62, 253, 52, 0.4)",
borderColor: "rgba(62, 253, 52, 1.0)"
},
],
};
const options = {
};
return (
<Radar data={data} options={options} />
);
}
}

class Level extends React.Component {

constructor (props) {
super(props)
this.state ={
count:0,
}
}

counts () {
this.setState ({count: this.state.count + 1})
}

render() {

return(
<div>
<div className="itemabove">
<div className="item">
<span>{this.props.value}</span>
<button onClick = {() => this.counts()}>+</button>
<p><span className="levelitem">Level. {this.state.count}</span></p>
</div>
</div>
</div>
);
}
}

class Levels extends React.Component {
constructor () {
super()
this.state ={
counters: [
{id:1, value:"English Speaking"},
{id:2, value:"English Listening"},
{id:3, value:"English Reading(CNN)"},
{id:4, value:"Programming Coding"},
{id:5, value:"Training for strongth"},
{id:6, value:"health"}
],

}

 }

render () {

return( <div> <h1>また会う日まで、レベルアップしていようぜ。</h1> <Chart /> {this.state.counters.map(counter => ( <Level key={counter.id} value={counter.value} selected={true} rad={this.state.count}/> ))} </div> )

}
}

ReactDOM.render
(<Levels />, document.getElementById("root"));

試したこと

親コンポーネントであるLevels内で、子コンポーネントのLevel内にあるstateを再定義して、LevelsからChartコンポーネントにそのstateをpropsとして渡し、Chart内のdatasetsの中のdataでそのpropsを参照することはできたのですが、
ボタンをクリックするとそのstateが更新されるという実装がまだLevel内にある状態になり、それを取り出す方法がわかりません。
このコードはボタンを押すとLevel.0の0の部分だけが変わる時のコードです。ぜひご教授いただければと思います。
イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問