top of page
  • 執筆者の写真T sakurako

VueでWEBアプリ(16)

前回POSTの実装が形になったので、今回はGETで一覧表示を実装しました。

この記事では簡単なコードの説明と、実装中詰まったところの解説をしていきます。


今回はこちらの記事を参考にさせていただきました。


 

テンプレート

参考記事のほとんどまんまです。

v-data-tableで、取得したデータをどう表示すればいいのかと困っていたのですが、

テーブル項目にリンク埋め込みをしたときのように、v-data-tableの中身をいじりたいならtemplateを使用すればよかっただけでした。

    <v-container style="width: 1200px;">
      <v-data-table
         :headers="headers"
         :items="articleList"
         >
        <template slot="items" slot-scope="props">
          <td class="text-xs-center">{{ props.item.id }}</td>
          <td class="text-xs-center">{{ props.item.title }}</td>
          <td class="text-xs-center">{{ props.item.name }}</td>
          <td class="text-xs-center">{{ props.item.post_date }}</td>
          <td class="text-xs-center">{{ props.item.content }}</td>
          <td class="justify-center layout px-0">
          </td>
        </template>
      </v-data-table>
    </v-container> 

スクリプト

URLの変数名がPOSTのままですが、今のところいいネーミングが浮かばないのでこのままで…。

mounted()もまだ役割を完全には理解できていない(これがないと一覧取得・表示できないということはわかる)ので、今後の課題です。


export default {
    (中略)
  data () {
    return {
    (中略)
      headers: [
        {
          text: 'ID',
          value: 'id',
        },
        {
          text: 'タイトル',
          value: 'title',
        },
        {
          text: '投稿者',
          value: 'author',
        },
        {
          text: '投稿日時',
          value: 'post_date',
        },
        {
          text: '本文',
          value: 'content',
        },
      ],
      articleList: []
    }
  },
  methods: {
    async indexArticles () {
      this.articleList = [];
      try{
        const response = await axios.get(process.env.VUE_APP_API_URL)
        this.articleList = response.data.data;
      } catch(e) {
        console.log("articleList error" + e)
      }
    },
      (中略)
  mounted() {
    this.indexArticles();
  }


これで一覧表示できました。








ひっかかったところ


はじめ、一覧データ取得の箇所を以下のように書いてしまっていたので、テーブルが空で表示されてしまっていました。

  methods: {
   indexArticles () {
      this.articleList = [];
      try{
        const response = axios.get(process.env.VUE_APP_API_URL)
        this.articleList = response.data;
      } catch(e) {
        console.log("articleList error" + e)
      }
    },  

これだと


一覧データ取得が完了する前に次の処理が動いてしまう

response.dataでは一覧を受け取れない(データ構造が違う)


という二つの問題がある状態でしたので、async/awaitの追加・response.data.dataに修正をして、取得できるようになりました。


↓修正後


    methods: {
    async indexArticles () {
      this.articleList = [];
      try{
        const response = await axios.get(process.env.VUE_APP_API_URL)
        this.articleList = response.data.data;
      } catch(e) {
        console.log("articleList error" + e)
      }
    },

 

この『VueでWEBアプリ』シリーズのコードをgithubで公開しています。参考までに。

記事: Blog2_Post
bottom of page