typescriptでvue composition apiを使用しています(nuxtに導入)
やろうとしていること
axiosにてAPIリクエスト後、データをtemplateに表示
getBookでapiリクエストを行い、リアクティブな変数bookにレスポンスを代入してます
できないこと
非同期でレスポンスを受け取るのですが、まだ受け取ってない状態で、bookのtitleをtemplateに描画することができない
bookのみであれば表示可能 -> {{ book }}
bookのtitleを指したとき表示不可 -> {{ book.title }}
Cannot read property 'title' of undefined
非同期なのでデータが取れておらず、存在しないプロパティtitleを参照してしまいエラーとなります。
Book.ts
1type Book = { 2 bookId: number 3 title: string 4}
index.vue
1<template> 2 <div> 3 {{ book.title }} 4 </div> 5</template> 6 7<script lang="ts"> 8import { defineComponent, ref, onMounted } from '@vue/composition-api' 9 10const getBook = () => { 11 const book = ref<Book>() 12 13 const getData = () => { 14 axios.get(`api-url`).then((res) => { 15 book.value = res.data 16 }) 17 } 18 19 onMounted(() => { 20 getData() 21 }) 22 23 return { 24 book 25 } 26} 27 28export default defineComponent({ 29 setup () { 30 const book = getBook() 31 32 return { 33 book 34 } 35 } 36}) 37</script> 38
質問
初期化すれば、レスポンスが得られるまでからの値を表示することはできるのですが、これよりもっとスマートな方法はありませんか?値やプロパティが増えるたびに、初期がコストが掛かるので微妙だと思っています。
let book = ref<Book>() book = { title: '' }
そしてこの方法だとリアクティブになりません。
<input type="text" v-model="book.title"> {{ book.title }}
inputでbook.titleを書き換えても{{ book.title }}は変わらない。
あなたの回答
tips
プレビュー