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

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

詳細はこちら
Vue.js

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

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

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

Q&A

解決済

1回答

939閲覧

Firebaseの保存データを、Vue.jsのdata()に渡したい

chan-kama

総合スコア6

Vue.js

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

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

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

0グッド

0クリップ

投稿2020/12/01 12:42

前提・実現したいこと

Vue.jsで点数計算アプリを制作中です。
現在はFirebaseを使って、点数を保存出来る機能を実装中です。

FirebaseのRialtime Databaseに点数を保存することは出来ました。
Firebaseのコンソールで、意図通りに点数が保存されていることを確認出来ました。
しかし、その保存された点数を表示させることが出来ずに悩んでいます。

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

具体的にはWebページをリロードすると、input要素に入力した点数が消えてしまう状態です。

該当のソースコード

HTML

1<table class="table table-bordered table-striped mt-3"> 2 <thead class="thead-light"> 3 <tr> 4 <th class="col-sm gameCount"><span>第 </span>{{ gameCount }}<span> 試合</span></th> 5 <th class="col-lg">ゲート1</th> 6 <th class="col-lg">ゲート2</th> 7 <th class="col-lg">ゲート3</th> 8 <th class="col-lg">ゲート4</th> 9 <th class="col-lg">ゴール</th> 10 <th class="col-md">総打数</th> 11 <th class="col-md">加算点</th> 12 <th class="col-md">Total</th> 13 </tr> 14 </thead> 15 <tbody> 16 <tr 17 v-for="(row, number) in rows" 18 :key="number" 19 > 20 <th class="col-sm">{{ row.number }}<br>{{ row.name }}<br>さん</th> 21 <td> 22 <counter-hit v-model="row.scores.gate1.hit" :database="row.number + '-' + 'gate1-hit'"></counter-hit> 23 <hoop-in v-model="row.scores.gate1.in"></hoop-in> 24 </td> 25 <td> 26 <counter-hit v-model="row.scores.gate2.hit" :database="row.number + '-' + 'gate2-hit'"></counter-hit> 27 <hoop-in v-model="row.scores.gate2.in"></hoop-in> 28 </td> 29 <td> 30 <counter-hit v-model="row.scores.gate3.hit" :database="row.number + '-' + 'gate3-hit'"></counter-hit> 31 <hoop-in v-model="row.scores.gate3.in"></hoop-in> 32 </td> 33 <td> 34 <counter-hit v-model="row.scores.gate4.hit" :database="row.number + '-' + 'gate4-hit'"></counter-hit> 35 <hoop-in v-model="row.scores.gate4.in"></hoop-in> 36 </td> 37 <td> 38 <counter-hit v-model="row.scores.goal.hit" :database="row.number + '-' + 'goal-hit'"></counter-hit> 39 <hoop-in v-model="row.scores.goal.in">ネットイン</hoop-in> 40 </td> 41 <td> 42 <div class="sum">{{ sum(number) }}</div> 43 </td> 44 <td> 45 <div class="addition">{{ addition(number) }}</div> 46 </td> 47 <td> 48 <div class="total">{{ sum(number) + addition(number) }}</div> 49 </td> 50 </tr> 51 </tbody> 52</table>

JavaScript

1/* ------------------------------------------------------------------------- 2 「打数」のテンプレート 3------------------------------------------------------------------------- */ 4const counterHit = { 5 props: ['value', 'database'], 6 methods: { 7 countUp() { 8 this.$emit('input', this.value + 1); 9 // プロパティ「database」から行番号を取得 10 const number = this.database.slice(0, 1); 11 // プロパティ「database」からゲート番号を取得 12 const gate = this.database.slice(2); 13 // Firebaseにデータを保存 14 firebase 15 .database() 16 .ref(`users/${currentUID}/${number}/${gate}`) 17 .set(this.value + 1); 18 }, 19 countDown() { 20 if ( this.value > 0 ) { 21 this.$emit('input', this.value - 1); 22 const number = this.database.slice(0, 1); 23 const gate = this.database.slice(2); 24 firebase 25 .database() 26 .ref(`users/${currentUID}/${number}/${gate}`) 27 .set(this.value - 1); 28 } 29 }, 30 }, 31 template: ` 32 <form> 33 打数 34 <div class="form-group input-group"> 35 <div class="input-group-prepend"> 36 <button 37 type="button" 38 @click="countUp" 39 class="btn btn-primary btn-up" 40 >+</button> 41 </div> 42 <input 43 type="number" 44 :value="value" 45 min="0" 46 disabled 47 class="form-control hit-input" 48 > 49 <div class="input-group-append"> 50 <button 51 type="button" 52 @click="countDown" 53 class="btn btn-secondary btn-down" 54 >-</button> 55 </div> 56 </div> 57 </form> 58 `, 59}; 60 61 62/* ------------------------------------------------------------------------- 63 Vueインスタンスの内容 64------------------------------------------------------------------------- */ 65new Vue({ 66 el: '#app', 67 data() { 68 return { 69 gameCount: 1, // 試合数のデータ 70 rows: [], // 各ゲートの打数とフープインの配列データ 71 }; 72 }, 73 // 各ゲートに配列rowsのデータを登録 74 created() { 75 for (const number of 'ABCDEF') { 76 this.rows.push({ 77 number: number, 78 name: '', 79 scores: { 80 gate1: {hit: 0, in: ''}, 81 gate2: {hit: 0, in: ''}, 82 gate3: {hit: 0, in: ''}, 83 gate4: {hit: 0, in: ''}, 84 goal: {hit: 0, in: ''}, 85 }, 86 }); 87 } 88 },
Firebaseの保存データ アプリ名   ↳users     ↳ユーザID(user.uid)       ↳A         ↳gate1-hit: 0         ↳gate2-hit: 0         ↳gate3-hit: 0         ↳gate4-hit: 0         ↳goal-hit: 0       ↳B         ↳gate1-hit: 0         ↳gate2-hit: 0         ↳・・・・・・・・・・・・・・・・・・・・・・・・・・・・

試したこと

Vueインスタンスのcreated()でscoresを初期化しているので、ページをリロードすると入力した点数が0に戻るのだと思います。
ここを0で初期化せずに、Firebaseに保存されたデータを渡すことが出来れば解決できるのではと考えています。

created()の中に、firebase.database().ref(キー名).on()を書いてみたりしましたが、上手くいきませんでした。
そもそもcreated()やdata()に着目している、私の考えが間違っているのでしょうか?

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

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

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

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

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

guest

回答1

0

自己解決

getValue()という関数を下記のように作成。

javascript

1const getValue = () => { 2 if (currentUID !== null) { 3 firebase 4 .database() 5 .ref(`users/${currentUID}`) 6 .on('value', (snapshot) => { 7 const gates = [ 8 'gate1', 9 'gate2', 10 'gate3', 11 'gate4', 12 'goal', 13 ]; 14 let i = 0; 15 for (const number of 'ABCDEF') { 16 const appData = app._data.rows[i]['scores']; 17 for (const gate of gates) { 18 // Firebaseから打数データを取得 19 const gateHit = snapshot.val()[number][`${gate}-hit`]; 20 const gateIn = snapshot.val()[number][`${gate}-in`]; 21 // 取得したデータを(app)Vueのdata()に渡して表示 22 appData[gate]['hit'] = gateHit; 23 appData[gate]['in'] = gateIn; 24 } 25 i++; 26 } 27 }); 28 }; 29};

このgetValue()を、ログイン状態が変化した時のコールバックに登録したら、意図通りに実装出来ました。

javascript

1// ユーザのログイン状態が変化したら呼び出される、コールバック関数を登録 2// ログインユーザのUID 3let currentUID = null; 4 5firebase.auth().onAuthStateChanged((user) => { 6 if (user) { 7 console.log('状態:ログイン中'); 8 currentUID = user.uid; 9 changeView(); 10 getUserName(); 11 getValue(); 12 } else { 13 console.log('状態:ログアウト'); 14 currentUID = null; 15 changeView(); 16 } 17});

ありがとうございました。

投稿2020/12/04 11:49

chan-kama

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問