🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

Q&A

解決済

1回答

1490閲覧

Vue.jsで外部APIから取得しデータが反映されない

malfoy_

総合スコア2

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

0グッド

0クリップ

投稿2021/01/23 04:05

前提・実現したいこと

Vue.js、Quasar、Node.js、Firebaseを使用して簡単な記録アプリのグラフ描画機能を実装中です。
現在、親コンポーネントでサーバよりデータを取得し、子コンポーネントでpropsで渡されたデータからグラフを描画しようと考えています。

vueのソースコード変更(リロード)後、1回目のデータ取得リクエスト時にはグラフ描画に成功します。
しかし、2回目以降のリクエスト(ページリフレッシュ)時にはグラフが描画されなくなってしまい、以下のエラーメッセージが発生します。

発生している問題・エラーメッセージ

TypeError: Cannot read property 'キッチン' of undefined

データ取得前にグラフ描画の処理を行ってしまっている?

該当のソースコード

親コンポーネント Stats.vue

vue

1<template> 2 <q-page class="flex flex-center"> 3 <h3 class="text-grand-hotel text-bold text-primary"> 4 Statistics 5 </h3> 6 <chart :records="records"></chart> 7 </q-page> 8</template> 9 10<script> 11import Chart from "../components/Chart"; 12import { date } from "quasar"; 13 14export default { 15 name: "Stats", 16 components: { 17 Chart 18 }, 19 data() { 20 return { 21 records: [] 22 }; 23 }, 24 methods: { 25 getRecords() { 26 this.$axios 27 .get(`${process.env.API}/records`) 28 .then(response => { 29 this.records = response.data; 30 31 console.log(this.records); 32 }) 33 .catch(err => { 34 this.$q.dialog({ 35 title: "Error", 36 message: "Could not download records." 37 }); 38 }); 39 } 40 41 }, 42 created() { 43 this.getRecords(); 44 console.log("CreateStats"); 45 } 46}; 47</script> 48 49<style lang="sass"></style> 50

子コンポーネント

<script> import { Bar } from "vue-chartjs"; import { records } from "../pages/Stats.vue"; export default { props: ["records"], extends: Bar, name: "chart", data() { return { data: { labels: [ "キッチン", "風呂", "トイレ" ], datasets: [ { label: "鈴木", data: [ this.records.suzuki.キッチン, this.records.suzuki.風呂, this.records.suzuki.トイレ ], backgroundColor: [ "rgba(255, 99, 132, 0.2)", "rgba(255, 99, 132, 0.2)", "rgba(255, 99, 132, 0.2)", ], borderColor: [ "rgba(255, 99, 132, 1)", "rgba(255, 99, 132, 1)", "rgba(255, 99, 132, 1)", ], borderWidth: 1 }, { label: "佐藤", data: [ this.records.sato.キッチン, this.records.sato.風呂, this.records.sato.トイレ ], backgroundColor: [ "rgba(54, 162, 235, 0.2)", "rgba(54, 162, 235, 0.2)", "rgba(54, 162, 235, 0.2)" ], borderColor: [ "rgba(54, 162, 235, 1)", "rgba(54, 162, 235, 1)", "rgba(54, 162, 235, 1)" ] borderWidth: 1 } ] }, options: { scales: { xAxes: [ { scaleLabel: { display: false, labelString: "" } } ], yAxes: [ { ticks: { beginAtZero: true, stepSize: 5 } } ] } } }; }, mounted() { this.renderChart(this.data, this.options); } }; </script>

試したこと

ページリフレッシュ時に再取得したデータをrecordsにセットする前にグラフ描画処理が行われていると考え、以下の記事を参考に、watchでデータがセットされた時にグラフ再描画するようにしましたが、エラー内容は変わらず上手く行きませんでした。

watch: { records: function () { // チャート作成関数を呼び出し this.renderChart(this.data, this.options); }

Vue.jsで外部APIから取得したデータが反映されないときの対処法メモ

vueインスタンスのライフサイクルや状態管理などの理解が浅く、リロード後二度目以降のデータリクエストで、グラフ描画処理前にデータがセットされないのかがわかりません。
どなたかご回答いただけると幸いです。

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

vueのバージョン : 2.6.12
vue-chartjsのバージョン : 3.5.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

データが到着する前にあなたはチャートを表示しようとしてしまいます。これを防ぐには、単純な v-ifが最善の解決策です。

APIから取得したデータを用いたチャート

<chart v-if="records.length !== 0" :records="records"></chart>

「1回目のデータ取得リクエスト時にはグラフ描画に成功」するのは不思議ですが、上記をお試しください。

投稿2021/01/23 04:38

neko_daisuki

総合スコア2090

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

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

malfoy_

2021/01/23 04:57

うまくいきました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問