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

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

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

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Q&A

1回答

3702閲覧

子コンポーネントから親コンポーネントに値が反映されない。

fork_

総合スコア43

Vue.js

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

0グッド

0クリップ

投稿2020/06/16 14:40

vue.jsで家計簿アプリを作成中です。
vue-routerを使用しています。
収入コンポーネントを作り込んでいるところです。
子コンポーネント側で日付と金額と名目を入力し、登録ボタンを押しても値が反映されません。
子コンポーネントから、emitイベントで親コンポーネントのメソッドを呼び出すようにしているのですが、どの部分が悪いのかがわからない状態です。
テンプレート側ではエラーメッセージは出ていません。
ご教示のほど、よろしくお願い致します。

親コンポーネントは下記になります。

vue:

1##親コンポーネント 2 3<template> 4 <div id="app"> 5 <div id="nav"> 6 <router-link to="/income">収入</router-link>| 7 <router-link to="/bop">収支</router-link>| 8 <router-link to="/payment">支出</router-link> 9 </div> 10 <router-view 11 :incomes="incomes" 12 :income-money="incomeMoney" 13 :income-date="incomeDate" 14 :income-nominal="incomeNominal" 15 @add-income="addIncome" 16 /> 17 </div> 18</template> 19 20<script> 21export default { 22 data() { 23 return { 24 incomes: [], 25 incomeMoney: 0, 26 incomeDate: "", 27 incomeNominal: "", 28 payments: [], 29 paymentMoney: 0, 30 paymentDate: "", 31 paymentNominal: "" 32 }; 33 }, 34 methods: { 35 addIncome() { 36 this.incomes.push({ 37 icd: this.incomeDate, 38 icm: this.incomeMoney, 39 icn: this.incomeNominal 40 }); 41 this.incomeDate = ""; 42 this.incomeNominal = ""; 43 this.incomeMoney = 0; 44 45 // this.save(); 46 } 47 } 48}; 49</script> 50 51

vue

1##子コンポーネント 2 3<template> 4 <div> 5 <h1>収入ページ</h1> 6 <p> 7 日付選択: 8 <!-- <input type="Date" v-model="incomeDate" /> --> 9 <input type="Date" v-bind:value="incomeDate" @input="$emit('input',$event.target.value)" /> 10 </p> 11 <p> 12 金額: 13 <input 14 type="number" 15 v-bind:value="incomeMoney" 16 @input="$emit('input',$event.target.value)" 17 />円 18 </p> 19 <p> 20 名目: 21 <input 22 type="text" 23 v-bind:value="incomeNominal" 24 @input="$emit('input',$event.target.value)" 25 /> 26 </p> 27 <button @click="addIncome">登録</button> 28 <hr /> 29 <div v-for="income in incomes" :key="income.no">{{incomeDate}}:{{incomeMoney}}:{{incomeNominal}}</div> 30 </div> 31</template> 32 33<script> 34export default { 35 props: { 36 incomes: Array, 37 incomeMoney: Number, 38 incomeDate: String, 39 incomeNominal: String 40 }, 41 42 methods: { 43 addIncome() { 44 this.$emit("add-income"); 45 } 46 } 47}; 48</script> 49 50

イメージ説明

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

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

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

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

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

guest

回答1

0

$emitで親コンポーネントのメソッドを呼んだところで呼ばれるだけであって親の値が変化することはないはずです。

vm.$emit
$emit を追加の引数と共に使う場合:
のようにパラメータを渡せるので渡してあげるとかになります。



単方向のデータフロー

JavaScript のオブジェクトと配列は、参照渡しされることに注意してください。参照として渡されるため、子コンポーネント内で配列やオブジェクトを変更すると、 親の状態へと影響します。

を利用するっていうのもある(書いてあるので使ってもいいのかな…)


vue

1 <input 2 type="text" 3 v-bind:value="incomeNominal" 4 @input="$emit('input',$event.target.value)" 5 />

こういう記載多いけど、
コンポーネントで v-model を使う

のv-modelの変わりの書き方に近いけど、違うのかな…

投稿2020/06/16 15:45

編集2020/06/16 15:47
rururu3

総合スコア5545

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

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

fork_

2020/06/17 14:20

ご回答ありがとうございます。 公式ドキュメントにもございます通り、@input="$emit('input',$event.target.value)の形式でないと動作しないと書いておりました。。 vue-routerは使わず、簡単なTODOアプリで実際に子コンポーネントから親コンポーネントに値を渡して試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問