LoginSignup
7
11

More than 3 years have passed since last update.

Vuex内でAPIを叩きVue.jsのcreated内でstateを取得する

Last updated at Posted at 2019-07-04

はじめに

初めての投稿です。

今回Vuex内でaxiosを使いAPIからデータを取得します。
サイトにアクセスした際にVue.jsのコンポーネントへデータを渡し画面にデータを表示させます。

準備

バージョン 必須
Laravel 5.8.26 no
Vue.js 2.5.17 yes
Vuex 3.1.1 yes
axios 0.18 yes

自分はLaravelを使いAPIもそちらで用意しました。
APIさえ使えればどのような状態でも大丈夫です。

処理の流れ

①Vue.jsのcreated内でVuexのactionを呼び出す
②actionがAPIを叩く
③actionがAPIから取得したデータを引数としてmutationを呼び出す
④mutationでstateを更新する
⑤その後getterでstateを取得する

Vuexのコード

article.js
export default {
    namespaced: true,

    state: {
        articles: [],
    },

    getters: {
        getAll: state => {
            return state.articles;
        },

        getOne: state => id => {
            return state.articles.find(list => list.id === id);
        },
    },

    mutations: {
        setArticles: (state, payload) => {
            state.articles = payload.data;
        },
    },

    actions: {
        async setArticles({ commit }) {
            const payload = {
                data: '',
            };
            await axios.get('/api/articles')
            .then(response => {
                payload.data = response.data['data'];
                commit('setArticles', payload);
            })
            .catch(error => {
                console.log(error);
            });
        },
    },
}

APIから送られてくるデータはjsonです。

{
    "data": [
        {
            "id": 1,
            "title": "non",
            "body": "Sed non accusantium rem ad totam necessitatibus."
        },
        {
            "id": 2,
            "title": "totam",
            "body": "Ab et veritatis veniam et expedita voluptatem ipsam."
        },
        {
            "id": 3,
            "title": "magnam",
            "body": "Error enim laboriosam saepe delectus est."
        },
        {
            "id": 4,
            "title": "assumenda",
            "body": "Delectus tempore omnis occaecati quibusdam nisi."
        },
        {
            "id": 5,
            "title": "error",
            "body": "Quia exercitationem delectus vitae nulla corrupti eos."
        }
    ]
}

Vue.jsのコード

Article.vue
<template>
    <div>
        <p>{{ article_list }}</p>
    </div>
</template>

<script>
import { mapActions, mapGetters } from 'vuex';
export default {

    data() {
        return {
            article_list: [],
        }
    },

    created() {
        //this.setArticles;     非同期で処理されるためか遅れて完了する
        //this.article_list = this.getAll;      stateが更新されるよりも先に実行される
        this.setArticles().then( () => this.article_list = this.getAll );       //この書き方でうまく動いた
    },

    computed: {
        ...mapGetters('articles', [
            'getAll',
        ]),
    },

    methods: {
        ...mapActions('articles', [
            'setArticles',
        ]),
    },

}
</script>

コメントアウトしている箇所で苦しみました。

出力結果

vue-article.png
きちんと出力されました。

最後に

JavaScriptを勉強したことがないためこのような書き方でいいのか正直わかっていません。
コメントのほうでご教授してもらえたら幸いです。

7
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11