前提・実現したいこと
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()に着目している、私の考えが間違っているのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。