nuxtを勉強しており、以下はajaxでデータを取ってきてそれをテーブルに表示するだけの処理です。
※以下ではvuetify
やtypescript
を使ってますが今回の質問にはさほど関係ないのでないのであえてタグは付けませんでした。
vue
1<template> 2 <v-row justify="center" 3 align="center"> 4 <v-col cols="12"> 5 <v-btn @click="redrawBlogs"> 6 redraw 7 </v-btn><!-- @REVIEW 再描画ボタン --> 8 <v-data-table 9 :loading="loading" 10 :headers="headers" 11 :items="items" 12 :items-per-page="10" 13 class="elevation-1" /> 14 </v-col> 15 </v-row> 16</template> 17 18<script type="ts"> 19import Vue from 'vue'; 20 21export default Vue.extend({ 22 data: () => ({ 23 loading: false, 24 headers: [ 25 { 26 text: 'id', 27 align: 'start', 28 sortable: false, 29 value: 'id' 30 }, 31 { 32 text: 'TITLE', 33 sortable: true, 34 value: 'title' 35 }, 36 ], 37 items: [] 38 }), 39 created () { 40 this.redrawBlogs(); // @REVIEW 初期の描画 41 }, 42 methods: { 43 async fetchBlogs () { 44 const response = await this.$axios.get('/api/blogs'); 45 return response.data || []; 46 }, 47 async redrawBlogs () { 48 this.loading = true; 49 const data = await this.fetchBlogs(); 50 this.items = data; 51 this.loading = false; 52 } 53 } 54});
created
で初期表示時のデータを取得しています。
nuxtにはasyncData
なるものがあり、created
を削除し下記のコードに置き換えました。
vue
1 async asyncData ({ $axios }) { 2 const response = await $axios.get('/api/blogs'); 3 return { items: response.data || [] }; 4 },
すると初期化前に実行されるのでデータが取れた状態から表示できます。
しかし、$axiosの部分が冗長になり、仮に修正があった際は2か所直さなければなりません。
vue
1 const response = await this.$axios.get('/api/blogs');
asyncData
はthisは使えないし、methodsも呼び出せない。(←あってますよね?)
上記のようなケースでもう少しいい組み方はあるのでしょうか?
よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。