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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

6181閲覧

axiosでAPIのJSONを取得後、VueとVuexを使い stateに情報をストックしたい

yuki1010

総合スコア43

Vue.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/06/11 07:06

SPAの初心者です。何卒ご教授宜しくお願いします。

はじめから躓いていることは、Vueで自作のAPIからデーター(記事の配列)を取得して、vuexにあるstateのpostsにその情報を格納したいです。
自分のコードを一部抜粋しました。
その後にエラー画面を載せます。

Top.vue

javascript

1<template> 2<div> 3 <p> 4 トップページ 5 </p> 6</div> 7</template> 8 9<script> 10import { mapState, mapActions } from 'vuex' 11 12import axios from 'axios' 13 14export default { 15 name: 'top', 16 created: function() { 17 this.fetchAddPost() 18 }, 19 computed: { 20 ...mapState([ 21 'posts' 22 ]) 23 }, 24 methods: { 25 ...mapActions([ 26 'fetchAddPosts' 27 ]), 28 fetchAddPost: function() { 29 const new_axios = axios.create({ 30 headers: { 31 'Content-Type': 'application/json' 32 }, 33 responseType: 'json' 34 }); 35 const endpoint = '/api/posts/' 36 new_axios.get(endpoint) 37 .then(function(response) { 38 /**********ここがスクショした概要の箇所です。************/ 39 console.log(response.data) 40 this.fetchAddPosts(response.data) 41 42 }) 43 .catch(function(error) { 44 console.log('エラーだよ', error); 45 }) 46 } 47 48 } 49} 50</script> 51 52<style> 53 54</style>

store.js

javascript

1import Vue from 'vue' 2import Vuex from 'vuex' 3 4Vue.use(Vuex) 5 6export default new Vuex.Store({ 7 state: { 8 posts: [] 9 }, 10 mutations: { 11 FETCH_ADD_POSTS: (state, posts) => { 12 state.posts = posts 13 } 14 }, 15 actions: { 16 fetchAddPosts: (context, posts) => { 17 context.commit('FETCH_ADD_POSTS', posts) 18 } 19 } 20})

イメージ説明

↑の画像のように、APIからのデータは上手く取得しているのですがvuexでのデーターのストックが上手く行きません。。。
どなたかわかる方いたらご教授宜しくお願いします。

vueとvuexの接続は上手くいっております。↑の2つのTop.vueとstore.jsが問題の部分かと思います、

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

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

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

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

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

guest

回答1

0

ベストアンサー

あまり正確にはわかってないのですが、以下の箇所のthisがVueインスタンスでないように思われます。

.then(function(response) { /**********ここがスクショした概要の箇所です。************/ console.log(response.data) this.fetchAddPosts(response.data) })

javascript

1fetchAddPost: function() { 2 const new_axios = axios.create({ 3 headers: { 4 'Content-Type': 'application/json' 5 }, 6 responseType: 'json' 7 }); 8 const endpoint = '/api/posts/' 9 // 追記 10 const self = this; 11 new_axios.get(endpoint) 12 .then(function(response) { 13 /**********ここがスクショした概要の箇所です。************/ 14 console.log(response.data) 15 // thisではなくselfに変更 16 self.fetchAddPosts(response.data) 17 18 }) 19 .catch(function(error) { 20 console.log('エラーだよ', error); 21 }) 22 } 23

こんな感じにするか、async,awaitを使って

fetchAddPost: async function() { const new_axios = axios.create({ headers: { 'Content-Type': 'application/json' }, responseType: 'json' }); const endpoint = '/api/posts/' const response = await new_axios.get(endpoint) .catch(function(error) { console.log('エラーだよ', error); }) this.fetchAddPosts(response.data); }

としたら動きませんか?

投稿2018/06/11 08:36

denzow

総合スコア640

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

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

yuki1010

2018/06/13 10:30

お教え頂いて本当にありがとうございます。 助かりました。 const self = this; を使って無事動作成功しました!! axios内の thisとfetchAddPost内の thisでご動作していたのですね!! すごく勉強になりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問