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

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

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

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

Vuetify.js

Vuetify.jsは、マテリアルデザインを基本とするVue.jsのCSSフレームワークです。多くのマテリアルデザインのコンポーネントを提供しており、あらゆるアプリケーションに対応可能。vue-cli用テンプレートがあり、簡単にページを作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

116閲覧

vueで、表示している複数グラフの中の1つをクリックしたらポップアップさせる方法

yuko0524

総合スコア28

Vue.js

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

Vuetify.js

Vuetify.jsは、マテリアルデザインを基本とするVue.jsのCSSフレームワークです。多くのマテリアルデザインのコンポーネントを提供しており、あらゆるアプリケーションに対応可能。vue-cli用テンプレートがあり、簡単にページを作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/04/12 06:43

実現したいこと

  1. DBに、果物マスタと売り上げデータがあるとする。
  2. 画面の上部に、日付(範囲指定可能)と、果物の名前を選択する入力エリアがある。果物名は、予めマスタに登録済みで、複数選択可能。
  3. 果物マスタには上限10種類まで登録済みで、それ以上はないとする。
  4. 売り上げデータから指定した日付の選択された果物を条件にしてデータを取得する。
  5. 果物ごとに売り上げデータをグラフ化する。
  6. 8種類の果物が選ばれたら、8つのグラフを1画面に表示するイメージ。

以上までは、自力でどうにか実現できております。
ここからさらに、例えば4番目のグラフをクリックしたら、そのグラフだけを画面の中心に
大きめにポップアップ表示させたいです。

発生している問題・分からないこと

画面中のグラフのうち、どれか1つをクリックしたときに、
ポップアップ表示用の関数(showPopup さらに displayPopup)
が呼ばれるところまでは確認できましたが、グラフの中身がうまく渡っていないようで、
クリックしても画面上では無反応となります。

該当のソースコード

template

1※グラフの定義部分の抜き出し 2<v-row v-bind="rowStyle"> 3 <!-- 最大表示グラフ数は、10までとする --> 4 <v-col v-for="index in 10" :key="index" cols="12" md="6" lg="4" xl="3" > 5 <!-- グラフコンポーネントの表示 --> 6 <v-card class="chart-card" @click="showPopup(index - 1)"> 7 <v-card-text class ="v-card-text"> 8 <div :id="generateChartContainerId(index - 1)" class="chart-container"></div> 9 </v-card-text> 10 </v-card> 11 </v-col> 12 <!-- ポップアップ --> 13 <div v-if="popupVisible" class="popup" @click="closePopup"> 14 <div class="popup-content"> 15 <div class="popup-chart-container" ref="popupChart" id="popup-chart-container"></div> 16 </div> 17 </div> 18</v-row>

script

1※関連する部分だけを抜き出し 2 3let popupVisible = false; // ポップアップ表示フラグ 4let popupIndex = null; // 選択されたグラフのインデックス 5 6// グローバルスコープでグラフのデータを管理する変数 7let graphData = []; 8 9// グラフクリック時の処理 10async function showPopup(index) { 11 console.log(`Clicked on graph ${index + 1}`,graphData[index]); 12 popupVisible = true; 13 popupIndex = index; 14 15 // グラフデータからクリックされたグラフに関連するデータを検索 16 const popupGraphData = graphData[index]; 17 18 // ポップアップを表示する関数にデータを渡して呼び出す 19 displayPopup(popupGraphData); 20}; 21 22 23// ポップアップを表示する関数 24async function displayPopup(popupGraphData) { 25 const matchingData = popupGraphData;//売り上げデータ 26 const f_name = matchingData.f_name;//果物名 27 28 // ポップアップ用の要素を取得 29 const popupChartContainer = ref(popupChart); ←エラーになるところ 30 console.log("----popupChartContainer----", popupChartContainer); 31 32 // ポップアップ用のEChartsインスタンスを作成し、グラフを描画 33 if (popupChartContainer) { 34 // すでに初期化されたインスタンスがあれば破棄 35 if (popupChartContainer.chart) { 36 popupChartContainer.chart.dispose(); 37 } 38 //グラフ描画処理の呼び出し 39 drawChart2(f_name, popupChartContainer, matchingData); 40 41 } 42 43 // ポップアップを表示 44 if (popupChartContainer) { 45 popupChartContainer.style.display = 'block'; 46 } 47}; 48 49 50// ポップアップを閉じる 51async function closePopup() { 52 popupChartContainer.style.display = 'none'; // ポップアップを非表示 53 // popupVisible = false; 54 // popupIndex = null; 55}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

// ポップアップ用の要素を取得
const popupChartContainer = ref(popupChart);
この部分が原因の1つになっていると思います。
実際に、
「Uncaught (in promise) ReferenceError: popupChart is not defined」というエラーになります。
この不具合をどのように回避したらよいのかわかりません。

そもそも実現したいことへの私のアプローチが正しいのかもわからないため、
ご指摘いただけますとありがたいです。

補足

WEB開発も日が浅いので、試行錯誤の日々です。
Windows 10 Pro 22H2
vue 3.4.20
vuetify 3.5.6
ブラウザ chrome

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

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

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

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

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

guest

回答1

0

ベストアンサー

refの用法を間違っている気がします。テンプレート上のrefプロパティとスクリプト上のrefの値を一致させる必要があります。変数処理用のrefに代入する初期値はnullにしておいて、refによって返された値を、テンプレート上のrefプロパティの値と同じpopupChartとしましょう。

vue公式の実例
テンプレート参照

投稿2024/04/15 01:16

編集2024/04/15 01:17
FKM

総合スコア3644

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

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

yuko0524

2024/04/15 08:03 編集

ご回答くださいまして、誠にありがとうございます! 確かにrefの用法をしっかり理解しておりませんでした・・・。 ご紹介しただいたサイトでも内容を確認しましたが、 自分のソースに置き換えて考えると、今一つ反映できずにいる次第です。 ご指摘部分の修正に合わせて、色々コードを調整したのですが、 まだまだ技量が足らずポップアップでグラフ表示まで至りません。 まず、templateでは、ref=popupChart とした場合に、 スクリプト側の部分ですが、ご教示いただいた内容で表した場合、 const aaa =ref(null); const popupChart = ref(aaa);というコードになりますか? aaaのところがどの部分になるのか、自分で書いておきながら堂々巡りしています。 以下は、書き直したコードになります。 今は、グラフ描画用の自作関数において引数として渡す項目の中の コンテナがnullの状態なので関数でエラーになります。 refのpopupChart とコンテナの変数popupContainer をどう設定すると 実現できるのか躓いています。 -------------------------------------------------------------------------------------- // ポップアップの表示状態を管理するリアクティブな変数 const popupVisible = ref(false); const popupIndex = ref(-1); // ポップアップ内の要素を参照するref //まだ未完成の部分 const aaa =ref(null); const popupChart = ref(aaa); // グローバルスコープでグラフのデータを管理する変数 let graphData = []; // グラフクリック時の処理 const showPopup = (index) => { console.log(`Clicked on graph ${index + 1}`,graphData[index]); // クリックされたグラフのインデックスを更新 popupIndex.value = index; // ポップアップを表示 popupVisible.value = true; // グラフ表示する関数にデータを渡して呼び出す drawGraph(index); }; // ポップアップを閉じる const closePopup=()=> { // popupChartContainer.style.display = 'none'; // ポップアップを非表示 popupVisible = false; popupIndex = null; } // グラフを表示する関数 const drawGraph = (index) => { console.log("----in drawGraph----"); // クリックされたグラフのデータを取得 let data = graphData[index]; console.log("graphData:",data) const matchingData = data ;//売り上げデータ const f_name = matchingData.f_name;//果物名 // グラフデータが初期化されているか確認 if (typeof graphData[index] !== 'undefined') { // クリックされたグラフのデータを取得して描画 drawChart2(f_name, popupContainer, matchingData); } else { console.error('Graph data is not initialized.'); } }; ------------------------------------------------------------------------------ <その後に試したこと> テンプレートに、 id="popup-graph" を追記して、 const popupChartContainer = document.getElementById("popup-graph"); を追加しましたがconsole.logで見ると、popupChartContainer はnull でした・・・。
FKM

2024/04/15 08:15

const popupChart = ref(null) となります。また、スクリプト内で操作する際にはrefを使用した場合、一旦valueに代入しないと値を引き出すことができません。したがってpopupChart.valueとなるはず。 if (popupChart.value) { のように、書き換える必要があります。 refはスクリプト内はvalueをつけて値を取得、テンプレート内はrefに紐づいたプロパティ名そのもので値を紐づけることになります。
yuko0524

2024/04/16 05:37

何度もご対応いただきありがとうございます。 指摘の部分について解決しました。 もっと場数を踏んで、スキルアップしたいと思います。 この度は本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問