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

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

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

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

Q&A

解決済

1回答

1914閲覧

vue.jsの実行タイミングについて

gone0021

総合スコア1

Vue.js

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

0グッド

0クリップ

投稿2021/03/10 21:25

前提・実現したいこと

特定の要素をクリックするとaxiosでjsonを取得してその値を子コンポーネントに渡したいのですが、うまくいかないのでご教授頂きたくお願いいたします。
取得したjsonは親の変数に保存してpropsで子コンポーネントに渡すという処理です。
また、axiosによるjsonの取得は複数のmethodsで使用するため、個別にメソッドとして作成してクリックイベントで読み込む処理にしています。

例としてconsole.log()で出力しているだけですが、1回目のクリックでは子コンポーネントのtoChildに渡されず2回目のクリックで"toChild"propsに値が代入されていることが確認できています。

該当のソースコード(一部を抜粋)

php

1<html> 2... 3<button @"onClick(id)"></button> 4... 5<modal :to-child="child"></modal> 6<script> 7 data: { 8 items: "", 9 child: "", 10 }, 11 methods: { 12 onClick: function(id) { 13 thi.getitems(id); 14 this.child = this.items; 15 }, 16 17 getItems: function (id) { 18 axios.get("./url", { 19 params: {id: id}, 20 }).then( 21 function (res) { 22 this.items= res.data; 23 }.bind(this) 24 ).catch(function (e) { 25 console.error(e); 26 }); 27 }; 28</script> 29</html>

vue

1<template> 2 ... 3</template> 4export default { 5 props: ["toChild"], 6 mounted: function () { 7 console.log("to-child : mouted ↓ "); 8 console.log(this.toChild); 9 }, 10 updated: function () { 11 console.log("to-child updated ↓ "); 12 console.log(this.toChild); 13 }, 14};

以上よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

上手くいかない理由
axios が非同期のためthis.items = res.data; が実行されるよりも前に
this.child = this.items; が実行されてしまう。

解決策
getItems が Promise を返すようにして、呼び出す側では then の中に処理を書く。
そうすると、this.items = res.data; の後に then の中のthis.child = this.items;が実行されるはずです。

methods: { onClick: function(id) { this.getItems(id).then(() => { this.child = this.items; }) }, getItems: function (id) { return axios.get("./url", { ...

投稿2021/03/11 07:46

neko_daisuki

総合スコア2090

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

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

gone0021

2021/03/13 06:04

早速のご回答ありがとうございました。 また、お礼が遅くなり申し訳ございません。 アドバイスの通り記述することでうまく値を渡すことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問