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

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

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

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

JavaScript

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

Q&A

解決済

2回答

2512閲覧

Vue.js3で親コンポーネントから子コンポーネントのpropsへ動的な値を渡す方法がわからなくて困っています。

mee12

総合スコア101

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2022/02/24 02:12

編集2022/02/24 03:52

Vue.js3で親コンポーネントから子コンポーネントのpropsへ動的な値を渡す方法がわからなくて困っています。

参考URL
https://rennnosukesann.hatenablog.com/entry/2019/09/12/185701

html側の設定として、オブジェクトにラップしたものを v-bind:props-id="{ propsId } のようにし、
配列の文字として受け取るようなことの記載があったのですが、

どなたかご存知であれば教えて下さい。

html

1<div id="app"> 2 <button type="button" v-on:click="testAction()">TestAction</button> 3 4 <modal-component ref="child1" v-bind:props-id="{ propsId }"></modal-component> 5</div> 6 7<script type="text/x-template" id="modal-component-id"> 8 <div> 9 modal component 10 </div> 11</script>

javascirpt

1const modalComponent = { 2 template: "#modal-component-id", 3 4 props: [ "propsId" ], 5 6 data() { 7 return { 8 // 取得できなかった 9 id: this.propsId 10 } 11 }, 12 13 methods: { 14 initialModal() { 15 // 検証用 this.idは失敗している、this.propsIdは1回目は取得失敗、2回目は取得される 16 const id1 = this.id; 17 const id2 = this.propsId; 18 19 console.log("ok"); 20 }, 21 } 22}; 23 24const app = Vue.createApp({ 25 data() { 26 return { 27 propsId: "0" 28 } 29 }, 30 31 components: { 32 "modal-component": modalComponent 33 }, 34 35 methods: { 36 testAction() { 37 // 検証用にランダムの整数文字 1~10 38 this.propsId = Math.floor(Math.random() * 10).toString(); 39 40 this.$refs.child1.initialModal(); 41 } 42 } 43}); 44 45app.mount("#app");

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

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

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

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

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

sousuke

2022/02/24 03:27

this.props[0]の記述方法は正しいのですか? this.propsId.xxxとかではなく?
mee12

2022/02/24 03:50

コメントありがとうございます。 確かにthis.propsIdのように取得するようですが、 ボタンクリックの1回目は取得できなく、2回目は取得される状態です。 サンプルコードを検証用に修正します。
guest

回答2

0

ベストアンサー

html

1<modal-component ref="child1" v-bind:props-id="{ propsId }"></modal-component>

親のpropsIdに'0'が入っているのであれば
{ propsId } はjsのオブジェクト的に書くと

js

1 var propsId = '0' 2 var props = { propsId } 3 console.log(props.propsId) --'0' 4コード

こうなるはずなので初期値の取得は

javascript

1 data() { 2 return { 3 // 取得できなかった 4 //id: this.propsId 5 // this.propsIdまでが上記例えではprops 6 id : this.propsId.propsId 7 } 8 },

↑こうなるのでは?

投稿2022/02/24 05:33

sousuke

総合スコア3830

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

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

mee12

2022/02/24 07:20 編集

ご回答ありがとうございます。 this.propsId.propsIdで値がを取得することができました。 ただし、私の環境ではdata内で更新することができず、 data() { return { // id : this.propsId.propsId } }, 次のようにメソッドのイベントでしか値の取得ができませんでした。 methods: { initialModal() { const id = this.propsId.propsId; console.log("ok"); }, } できればdata内で値を取得、更新できればよいですが、動的に更新したい場合は、dataでの更新はできないのかもしれませんが。
sousuke

2022/02/24 08:01

よくわからないですけど https://jsfiddle.net/3ugq41j5/2/ こういうことですか? 提示のコードで実行したところ「id:this.propsId.propsId」で子の初期値のdata.idに値が 入りましたので他のコードに何かあるのだと思います。 それはそれとして値を独立させたければdata、親に依存したければcomputedでいいと思います。
mee12

2022/02/24 10:41 編集

コードで教えていただきありがとうございます。 コードを参考にさせていただき、検証していましたが、すみませんがよくわからなく、 ・dataのような書き方ができなく data() { return { // id : this.propsId.propsId } }, ・メソッド内では実行でき、component内のthis(data部)にセットできるので、問題ないのかもしれません。 methods: { initialModal() { this.id = this.propsId.propsId; console.log("ok"); }, }
sousuke

2022/02/24 12:25

https://jsfiddle.net/y3Lrze04/ できると思いますが…実行直後親のpropsIdの1が見えていますし、ここを変更すれば実行直後に変わります。 質問者さんがどういうことをしたいのかよくわかりません。 親のpropsIdが変化したときに子のidが動的に変更されている方がいいのか そうでないのかどちらでしょうか? 上のサンプルは親のpropsIdに子のidが依存しているサンプルです。 なので親側でpropsIdを変化させると即座に子のidが変化しています。 (incrementボタンで親のpropsId++すると子の表示も同様に増えています)
mee12

2022/02/25 03:00 編集

教えて頂いたコードをもう一度確認したところ、できない感じでした。 incrementを実行した後で、TestActionを実行しても、コンソール上で親のidは変化していましたが、子のidは変化していません。 やりたいことは 親のボタンを実行 → 子のmodalComponentにIdを渡すことです。 ですので、dataを使わずとも、親のボタンを実行して、子のメソッド内でidの値が取得できているので、 動作は問題ありませんでした。 ありがとうございます。
sousuke

2022/02/25 04:59

「教えて頂いたコードをもう一度確認したところ、できない感じでした。」 data() { return { id : this.propsId.propsId } }, このコードは変数に値を代入するコードであって、書いてある通りにできています。 同じように書くと以下のような感じで var propsId = { propsId : 0 } propsId.propsId = 5 var child = { id : propsId.propsId }; propsId.propsId = 10 console.log(child.id); ↑変数child.idは10ではなく5です。child.idはpropsId.propsIdと同一視しているのではなく その時の値を代入しているだけです。なので一度代入したらもう変わりません。 var child = { id : 5 }; としているのと同じです。追従するというような特殊効果はもともとありません。
mee12

2022/02/25 06:31 編集

詳しいご説明ありがとうございました。とてもよく理解できました。 もともとdata内で代入できるのは1回限りなんですね。 親から子へIdの数値を渡したい時は、メソッド内に書く必要がありますね。
mee12

2022/02/27 02:29 編集

もう一度動作させてみましたが、親の変更を子が受け取るようなことができませんでした。 (例) 1回目: 親:9 子:0 2回目: 親:3 子:9 動作させたソースの変更がありますので、質問を移動しました。 もしよろしければご確認お願いします。
guest

0

未解決のためクローズします

投稿2022/02/27 02:31

mee12

総合スコア101

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問