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

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

新規登録して質問してみよう
ただいま回答率
85.47%
ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Vue.js

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

JavaScript

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

Q&A

解決済

1回答

2393閲覧

APIリクエストしたい

退会済みユーザー

退会済みユーザー

総合スコア0

ECMAScript

ECMAScriptとは、JavaScript類の標準を定めるために作られたスクリプト言語です。

Vue.js

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

JavaScript

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

0グッド

0クリップ

投稿2018/05/18 16:56

質問

APIリクエストしたいです。
自分なりに試した所、以下の通り2点の問題が発生しました。
これらの問題が発生しないようにするには、どのようにAPIリクエストやデータ管理をするのが適切なのでしょうか。

ファイル構成

問題点1(試したこと1)

この方法は/api/serversに2回リクエストしてしまう問題があります。

  • App.js

js

1const app = new Vue({ 2 router, 3 components: { App }, 4 data () { 5 return { 6 servers: [] 7 } 8 }, 9 template: '<App/>', 10 async mounted() { 11 // serversが空ならAPIリクエストして初期化する 12 if (this.servers.length === 0) { 13 await this.getServers() 14 } 15 }, 16 methods: { 17 getServers: async function () { 18 let response = await fetch('/api/servers') 19 let json = await response.json() 20 this.servers = json 21 } 22 } 23}) 24 25app.$mount('#app')
  • Index.vue

js

1export default { 2 data () { 3 return { 4 selectedServerId: null 5 } 6 }, 7 async mounted () { 8 // serversが空ならAPIリクエストして初期化する 9 if (this.$root.servers.length === 0) { 10 await this.$root.getServers() 11 } 12 13 // serversの最初の要素をデフォルト値とする 14 this.selectedServerId = this.$root.servers[0].id 15 } 16}

問題点2(試したこと2)

この方法は/api/serversにリクエストする前にIndex.vuemounted()処理が実行されてしまう為、エラーが発生しています。

  • App.js

省略。「試したこと1」と変化なし。

  • Index.vue

js

1export default { 2 data () { 3 return { 4 selectedServerId: null 5 } 6 }, 7 async mounted () { 8 // serversが空ならAPIリクエストして初期化する 9 // if (this.$root.servers.length === 0) { 10 // await this.$root.getServers() 11 // } 12 13 // serversの最初の要素をデフォルト値とする 14 this.selectedServerId = this.$root.servers[0].id 15 } 16}

環境

Vue.js 2.5.7

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

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

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

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

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

guest

回答1

0

ベストアンサー

Index.vueのみでawait this.$root.getServers()を実行した所問題なくなりました。
App.vuecratedmountedthis.serversの値を利用した処理をすると恐らく問題が発生します。
this.serversが読み込まれる前に処理をする為。)
しかし、現在の私のプロジェクトでは問題ないので一度クローズとさせて頂きます。

  • App.vue

js

1const app = new Vue({ 2 router, 3 components: { App }, 4 data () { 5 return { 6 servers: [] 7 } 8 }, 9 template: '<App/>', 10 async mounted() { 11 // serversが空ならAPIリクエストして初期化する 12 // if (this.servers.length === 0) { 13 // await this.getServers() 14 // } 15 }, 16 methods: { 17 getServers: async function () { 18 let response = await fetch('/api/servers') 19 let json = await response.json() 20 this.servers = json 21 } 22 } 23}) 24 25app.$mount('#app')
  • Index.vue

js

1export default { 2 data () { 3 return { 4 selectedServerId: null 5 } 6 }, 7 async mounted () { 8 // serversが空ならAPIリクエストして初期化する 9 if (this.$root.servers.length === 0) { 10 await this.$root.getServers() 11 } 12 13 // serversの最初の要素をデフォルト値とする 14 this.selectedServerId = this.$root.servers[0].id 15 } 16}

投稿2018/05/20 03:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問