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

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

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

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

Q&A

解決済

1回答

3951閲覧

vueでコンポーネントのメソッドが動作しない

Sonono

総合スコア85

Vue.js

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

0グッド

1クリップ

投稿2021/09/30 00:42

vueを始めたばかりの初心者です。以下のコードを実行するとこういった画面になります。
下の123をクリックしたときにinputの中に数字が足されるようにしたいのですが、動作しません。下の123はthreenumbersコンポーネントに紐づけているので、threenumbersコンポーネントのaddNumbersメソッドが呼ばれて欲しいのですが、見つからないらしくエラーがでます。

一番上の1は試験的に挿入しているもので、testインスタンスに紐づいていますがこちらのaddNumbersメソッドは問題なく呼ばれます。

イメージ説明

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <div> <div id="display-number"> <input v-model="display" v-bind:placeholder="defaultDisplay"> </div> <div class="number" v-on:click="addNumber"> 1 </div> <div id="keypad"> <threenumbers v-on:click="addNumber" v-for="number in numbers" v-bind:number="number" v-bind:key="number.id" ></threenumbers> </div> </div> <script> var display = new Vue({ el: '#display-number', data: { display: '', defaultDisplay: '0312345678' } }) Vue.component('threenumbers', { props: ['number'], template: '<div>{{ number.text }}</div>', methods: { addNumber: function () { display.display += '1' }} }) var app = new Vue({ el: '#keypad', data: { numbers: [ { id: 0, text: '1' }, { id: 1, text: '2' }, { id: 2, text: '3' } ] } }) var test = new Vue({ el: '.number', methods: { addNumber: function () { display.display += '1' } } }) </script>

エラー

vue.js:634 [Vue warn]: Property or method "addNumber" 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. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. (found in <Root>) Vue warn]: Invalid handler for event "click": got undefined found in ---> <Threenumbers> <Root>

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

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

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

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

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

guest

回答1

0

ベストアンサー

addNumberthreenumbersに定義されているので、onclickに指定するのはthreenumberstemplate内でなければいけません。
今のようにコンポーネントに指定するなら外側のコンポーネント(app)に関数を定義して@onclick.nativeで指定するなどする必要があります。

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> <div> <div id="display-number"> <input v-model="display" v-bind:placeholder="defaultDisplay"> </div> <div id="keypad"> <threenumbers v-for="number in numbers" v-bind:number="number" v-bind:key="number.id"></threenumbers> </div> </div> <script> var display = new Vue({ el: '#display-number', data: { display: '', defaultDisplay: '0312345678' } }) Vue.component('threenumbers', { props: ['number'], template: '<div v-on:click="addNumber">{{ number.text }}</div>', methods: { addNumber: function() { display.display += this.number.text } } }) var app = new Vue({ el: '#keypad', data: { numbers: [{ id: 0, text: '1' }, { id: 1, text: '2' }, { id: 2, text: '3' } ] } }) </script>

投稿2021/09/30 04:47

k4a

総合スコア983

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

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

Sonono

2021/09/30 08:02

なるほど、ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問