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

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

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

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

Vue CLI

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

JavaScript

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

Q&A

解決済

1回答

1860閲覧

子コンポーネントでv-modelを使う時の挙動について

YYmd0525

総合スコア10

Vue.js

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

Vue CLI

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

JavaScript

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

0グッド

0クリップ

投稿2020/06/13 23:42

前提・実現したいこと

双方向データバインディングの学習中に起こった挙動がどういう仕組みなのか理解できなかったので、質問させていただきました。

http://www.fumiononaka.com/Business/html5/FN1811001.html
上記URLの04を行なっています。

親がApp.vue、
子がTodoInput.vueです。

ソースコード①だと、App.vueの{{ todo.text }}にも反映されていますが、
イメージ説明

ソースコード②だと、反映されず、consoleにてpropsを上書きするなと怒られます。

イメージ説明

この両者の違いはStringとObjectの違い?なのでしょうか。
それと、実際はpropsで子に渡して、子から親は$emitを使う方法が一般的だと思うのですが、
ソースコード①は値が変わっているので、これは使えるのかという事もお聞きしたいです。

ソースコード①

App

1<template> 2 <section id="app"> 3 <todo-input :todo="todo"></todo-input> 4 <label>{{ todo.text }}</label> 5 </section> 6</template> 7 8<script> 9import TodoInput from './components/TodoInput'; 10 11export default { 12 name: 'App', 13 data() { 14 return { 15 todo: { 16 text: 'あああ' 17 } 18 } 19 }, 20 components: { 21 TodoInput 22 } 23} 24</script>

TodoInput

1<template> 2 <input type="text" 3 v-model="todo.text"> 4</template> 5 6<script> 7 export default { 8 name: 'TodoInput', 9 props: { 10 todo: { 11 type: Object 12 } 13 }, 14 } 15</script>

ソースコード②

App

1<template> 2 <section id="app"> 3 <todo-input :text="text"></todo-input> 4 <label>{{ text }}</label> 5 </section> 6</template> 7 8<script> 9import TodoInput from './components/TodoInput'; 10 11export default { 12 name: 'App', 13 data() { 14 return { 15 text: 'あああ' 16 } 17 }, 18 components: { 19 TodoInput 20 } 21} 22</script>

TodoInput

1<template> 2 <input type="text" 3 v-model="text"> 4</template> 5 6<script> 7 export default { 8 name: 'TodoInput', 9 props: { 10 text: { 11 type: String 12 } 13 }, 14 } 15</script>

補足情報(FW/ツールのバージョンなど)

/hoge/.nodebrew/node/v14.2.0/lib
└─┬ @vue/cli@4.4.1
└── vue@2.6.11

Chrome: 83.0.4103.97(Official Build) (64 ビット)

Mac OS Mojave 10.14.6

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

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

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

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

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

guest

回答1

0

自己解決

https://jp.vuejs.org/v2/guide/components-props.html#%E5%8D%98%E6%96%B9%E5%90%91%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AD%E3%83%BC

こちらにて書いてありました。
Vue.jsというよりもJavaScriptの挙動だったようで…

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

投稿2020/06/14 07:30

YYmd0525

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問