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

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

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

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

Q&A

解決済

1回答

2188閲覧

Vue3で親から渡されたリストデータを子コンポーネントで表示できません

tampopopofu

総合スコア22

Vue.js

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

0グッド

1クリップ

投稿2023/01/01 09:02

前提

親子関係のあるコンポーネントで、親で取得したリストデータを子に渡します。
子はそのリストデータを表示するだけですが、リストデータ取得をawait使っているせいなのかF5等で更新した直後は表示されません。

  • 親コンポーネントの呼び出し
  • axiosでリストデータの取得開始
  • 子コンポーネントを描画
  • リストデータの取得完了

上記のようにリストデータの取得中に子コンポーネントが描画されるため、リストが表示されないと考えております。

リストデータの取得が完了してから子コンポーネントを描画させるか、
リストデータ取得の完了で子コンポーネントを再描画させる方法など何かしらの解決方法はございますでしょうか。

または、子コンポーネント側でリストデータを取るとかになるのでしょうか。
よろしくお願いいたします。

実現したいこと

  • 親コンポーネントを表示した時に子コンポーネントに渡したリストを表示したい。

発生している問題・エラーメッセージ

ページ遷移した直後のリストは表示されませんが、例えば「再取得」ボタンなどでリストデータを再取得して子コンポーネントに渡せばうまく表示されます。

該当のソースコード

js

1// 親コンポーネント 2<script setup> 3import axios from 'axios'; 4import { reactive } from 'vue'; 5 6// 子に渡すリストデータ 7let somethingList = reactive({}); 8 9// リストデータを取得(オブジェクトの配列が返ってくる) 10const getData = async () => { 11 const { data } = await axios.get('/api/something'); 12 somethingList = data; 13}; 14 15// 再取得用 16const reGet = () => { 17 getData(); 18} 19</script> 20 21<template> 22 <div> 23 <Child :somethingList="somethingList" /> 24 <button @click="reGet">再取得</button> 25 </div> 26</template>

js

1// 子コンポーネント 2<script setup> 3const props = defineProps({ 4 somethingList: Object[] 5}); 6</script> 7 8<template> 9 <ul> 10 <li v-for="something in somethingList"> 11 {{ something.id }} 12 </li> 13 </ul> 14</template>

試したこと

再取得ボタンを作ってリストデータを再取得して子コンポーネントに渡せばうまく表示されました。

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

vue: 3.2.45
vue-router: 4.0.16
axios: 0.27.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

現状、コンポーネントが読み込まれた時にデータを取得する処理が入っていないのでそれが原因かなと推測しています。
そのため、マウント時にデータを取得する処理を親コンポーネント側に追加すれば上手くいきそうな気がします。
下記を追加してうまくいくか見ていただけますでしょうか?

js

1onMounted(() => { 2 getData(); 3});

今回は マウントされた時 のライフライクルフックを使用しましたが、他にもあるので詳細はこちらを見ていただければと思います!
https://v3.ja.vuejs.org/api/options-lifecycle-hooks.html

投稿2023/01/02 02:54

編集2023/01/02 02:57
k29

総合スコア22

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

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

tampopopofu

2023/01/03 05:36

回答ありがとうございます! ご指摘の方法でうまくいきました。 ありがとうございました!
k29

2023/01/03 05:50

お試しいただきありがとうございます! うまくいって良かったです🎉
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問