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

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

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

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

Q&A

1回答

4155閲覧

vueでproxyオブジェクトのプロパティの値を表示させたい

tou.23.bc

総合スコア50

Vue.js

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

0グッド

0クリップ

投稿2022/11/03 02:19

前提

vue3のオブジェクト操作にかんして質問があります。

データベースからidが最大のレコードを取得してそれをブラウザにひょうじするプログラムを作成しています。
以下プログラムです。

CategoryTopComponent.vue

1<script setup> 2 import { ref, reactive, onMounted } from "vue" 3 4 const category = ref('') 5 6 onMounted(() => { 7 8 axios.get('/api/top') 9 .then((res) => { 10 11 category.value = res.data 12 console.log(category) 13 console.log(category.value) 14 console.log(category.value[0]) 15 console.log(category.value[0].title) 16 }) 17 }) 18</script> 19<template> 20 <div>{{ category.value.title }}</div> 21</template>

console.logでデバッグすると以下の画像のように表示されます。

イメージ説明
この画像は 
console.log(category)
console.log(category.value)
console.log(category.value[0])
console.log(category.value[0].title)
の出力の結果です。

<template> <div>{{ category.value.title }}</div> </template> として、ブラウザにレコードのタイトル (dfgh)を表示させたいのですが上記のコードでは以下のエラーが表示されます。
CategoryTopComponent.vue:31 Uncaught TypeError: Cannot read properties of undefined (reading 'title') at Proxy._sfc_render (CategoryTopComponent.vue:31:24)

またサーバ側での処理はlaravelを使用しています。
一番idの大きいデータをフロント側へ送っています。

CategoryController.php

1 public function top() 2 { 3 $maxId = Category::max('id'); 4 5 6 return Category::where('id', '=', $maxId)->get(); 7 8 }
<div>{{ category.value[0].title }}</div>

などのいろいろな書き方でためしたのですがうまくいきませんでした。

laravel9, vue3を使用しており
componentAPI,OptionsAPIどちらの書き方でも試しましたが、レコードのタイトルを表示することはできませんでした。
どうぞよろしくおねがいいたします。

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

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

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

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

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

guest

回答1

0

mountedなどに書いた場合、axiosのような非同期通信はページ読み込み後に通信が完了し、値があとから挿入されます。
categoryの中身は最初に空文字で定義されているので、
ページ読み込み時はstringのために「.title」なんてないよ〜というエラーがでているのではないでしょうか。

例えば以下のように、通信が終わるまでローディング表示とv-if分岐するのはよくやります。

<template> <div v-if="loading">Loading...</div> <div v-else-if="error">Error!</div> <div v-else> <p>{{ data.firstName }} {{ data.lastName }}</p> </div> </template>

loadingは別途定義、{{ data.firstName }} などの部分が、{{ category.value[0].title }} になるイメージですかね。
▼上記を拝借した記事
https://zenn.dev/azukiazusa/articles/ref-vs-article#composables-%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AF%E5%B8%B8%E3%81%AB-ref-%E5%9E%8B%E3%81%A8%E3%81%99%E3%82%8B

質問の意図とは外れます& 私はあまりrefを使わないので詳しくはないのですが、
・最初に空文字(string型)で宣言してよいのか?(console見る限りデータはArray)
※データがひとつでいいならば、普通はArrayから取り出して扱った方が扱いやすいと思います
・templateで引用する際は valueは不要?
なども気になりましたので、上記の記事などを参考に一度みてみるといいかもしれません。

投稿2022/11/05 08:43

Lampii

総合スコア19

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

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

tou.23.bc

2022/11/05 08:48

コメントありがとうございます。 なすすべなく放置していたのですが、いただいたコメントを参考にもう一度トライしたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問