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

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

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

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

Q&A

解決済

2回答

1006閲覧

【初心者です】Vue.js 複数フォームに入力された数値を合計して表示させたい

chan-kama

総合スコア6

Vue.js

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

0グッド

0クリップ

投稿2020/10/03 11:59

編集2020/10/04 22:38

前提・実現したいこと

Vue.jsで点数計算をするアプリを制作しています。
「+」と「ー」のボタンを押下すると、フォーム内の打数の数値が増減する機能は実装出来ました。
現在は5つの打数を合計して、総打数に表示させる機能を実装中です。

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

{{count}}で表示させようとすると、エラーになります。
「countはコンポーネント内で定義されているので、コンポーネントの外では使えません」といった意味のエラーメッセージだと思います。

私としても、「確かにその通りだよなあ」と思います。

コンポーネントの外の処理に問題があると思うので、new Vue({});の中にコードを書き加える必要があるのかと思いますが、具体的にどうすれば良いのかわかりません。

Property or method "count" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property

該当のソースコード

HTML

1 <table class="table table-bordered"> 2 <!-- 見出し行 --> 3 <thead> 4 <tr> 5 <th class="col-sm"></th> 6 <th class="col-lg bg-light">ゲート①</th> 7 <th class="col-lg">ゲート②</th> 8 <th class="col-lg bg-light">ゲート③</th> 9 <th class="col-lg">ゲート④</th> 10 <th class="col-lg bg-light">ゴール</th> 11 <th class="col-md">総打数</th> 12 <th class="col-md bg-light">加算点</th> 13 <th class="col-md">Total</th> 14 </tr> 15 </thead> 16 <!-- 1行目 --> 17 <tbody class="counter"> 18 <tr> 19 <th>A</th> 20 <th class="bg-light"> 21 <counter></counter> 22 </th> 23 <th> 24 <counter></counter> 25 </th> 26 <th class="bg-light"> 27 <counter></counter> 28 </th> 29 <th> 30 <counter></counter> 31 </th> 32 <th class="bg-light"> 33 <counter></counter> 34 </th> 35 <th> 36 <div class="sum">{{ count }}</div> 37 </th> 38 <th class="bg-light"> 39 <div class="addition"></div> 40 </th> 41 <th> 42 <div class="total"></div> 43 </th> 44 </tr> 45 </tbody> 46 </table> 47 48

JavaScript

1const counter = { 2 data() { 3 return { 4 count: 0, 5 }; 6 }, 7 methods: { 8 countUp() { 9 if ( this.count < 0 ) { 10 this.count = 0; 11 } else { 12 this.count += 1; 13 } 14 }, 15 countDown() { 16 if ( this.count <= 0 ) { 17 this.count = 0; 18 } else { 19 this.count -= 1; 20 } 21 }, 22 }, 23 template: ` 24 <form class="ml-2 mr-2"> 25 打数 26 <div class="form-group input-group"> 27 <div class="input-group-prepend"> 28 <button type="button" @click="countUp" class="btn btn-primary">+</button> 29 </div> 30 <input type="number" v-model="count" min="0" disabled class="form-control"> 31 <div class="input-group-append"> 32 <button type="button" @click="countDown" class="btn btn-secondary">-</button> 33 </div> 34 </div> 35 </form> 36 `, 37}; 38 39new Vue({ 40 el: '.counter', 41 components: { 42 'counter': counter, 43 'hoop-in': hoopIn, 44 }, 45});

試したこと

new Vue({});の中にcomuputedを使った処理を書いたりしたのですが、ダメでした。

v-model="count"でcountという名前でフォームの数値は取得していると思うので、そのcountをコンポーネントの外で使用することが出来れば解決出来るのではと感じています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

この場合、子のコンポーネントから親のコンポーネントにデータを渡してあげる必要があります。
今回の場合でいうと、親コンポーネントはテーブルの部分で、子のコンポーネントはcounterです。

子から親へデータを渡す場合は、emitを使用します。

vue

1// 親コンポーネント 2<template> 3 <div> 4 <counter @up='up' @down='down' /> 5 <counter @up='up' @down='down' /> 6 TOTAL: {{ total }} 7 </div> 8</template> 9 10<script> 11 data: () => ({ 12 total: 0, 13 }), 14 methods: { 15 up () { 16 this.total++ 17 }, 18 down () { 19 this.total-- 20 } 21 } 22</script>

vue

1// 子コンポーネント 2<template> 3 <div> 4 <button @click="countUp">+</button> 5 <input type="number" v-model="count"> 6 <button @click="countDown">-</button> 7 </div> 8</template> 9 10<script> 11 export default { 12 data: () => ({ 13 count: 0, 14 }), 15 methods: { 16 countUp () { 17 if (this.count < 0) { 18 this.count = 0 19 } else { 20 this.count += 1 21 this.$emit('up') 22 } 23 }, 24 countDown () { 25 if (this.count <= 0) { 26 this.count = 0 27 } else { 28 this.count -= 1 29 this.$emit('down') 30 } 31 }, 32 }, 33 } 34</script>

子コンポーネント内のthis.$emitの部分で親のupメソッドなどを発火させています。
また、第2引数に渡したいデータを指定して、渡すことも可能です。

// 子コンポーネント this.$emit('up', 1)
/// 親コンポーネント up (val) { console.log(val) -> 1 }

投稿2020/10/05 14:13

stakizawa

総合スコア117

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

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

chan-kama

2020/10/06 10:47

$emitは公式リファレンスにありましたが、いまいち使い方がわかっていませんでした。 機能の実装が出来ました。ありがとうございました。
stakizawa

2020/10/06 10:51

解決出来てなによりです。 慣れてきたら、vuexなどを使ってみるとより簡単に実装可能かと思います。
guest

0

Property or method "count" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property

counterコンポーネート外ではcountが定義されていないにも関わらず{{count}}で呼び出そうとしているため

投稿2020/10/03 12:16

mikkame

総合スコア5036

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

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

chan-kama

2020/10/04 22:33

回答ありがとうございます。 エラーメッセージの内容を見て、自分でも「その通りだよなあ」と思います。 しかし、具体的にどのようにコードを直せば良いのか分かりません。
mikkame

2020/10/05 04:03

具体的には > <div class="sum">{{ count }}</div> が存在するためにそのエラーがでます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問