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

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

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

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

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

1195閲覧

APIで取得したdataがundifinedになってしまう

Nako4

総合スコア2

Vue.js

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

JavaScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/05/01 04:22

APIで取得したデータを使ってcomutedでページネーションのための処理を記述しようとしたところ、データがうまく使えない状態です。

解決したい内容
APIを使って取得し格納したデータの内容の確認方法

VuejsでTwitchAPIを使ってゲーム配信のデータを取得し表示するランキングアプリを作っています。
以下記述でTwitchAPIで取得したデータをstreamsに格納し、表示させることはできました。

vuejs

1 2export default { 3 name: 'getstream', 4 data() { 5 return { 6 streams: [], // APIから取得したデータ 7 } 8 }, 9 mounted() { 10 axios 11 .get("https://api.twitch.tv/kraken/streams/?language=ja&limit=20", {headers: headers}) 12 .then((response) => this.streams = response.data.streams) 13 .catch(error => console.log(error)) 14 }, 15}

次に以下のようにページネーションのためにこのデータを使った処理をcomputedに記述したところでエラーがでました。

vuejs

1export default { 2 name: 'getstream', 3 data() { 4 return { 5 streams: [], // APIから取得したデータ 6 parPage: 10, // 1ページに表示するデータ件数 7 currentPage: 1, // 現在の表示ページ 8 page: [], // ページ数 9 } 10 }, 11 mounted() { 12 axios 13 .get("https://api.twitch.tv/kraken/streams/?language=ja&limit=20", {headers: headers}) 14 .then((response) => this.streams = response.data.streams) 15 .catch(error => console.log(error)) 16 }, 17 18 methods: { 19 // 取得したデータ数に応じてページ数を設定 20 setPages() { 21 let numberOfPages = Math.ceil(this.streams.length / this.parPage); //全データ数/1ページに表示するデータ数 22 for ( let index = 1; index <= numberOfPages; index++) { 23 this.pages.push(index); 24 } 25 }, 26 }, 27 computed: { 28 // ページ番号にあわせてテストデータを抽出 29 paginate(streams) { 30 let page = this.page; //ページ数 31 let perPage = this.perPage; //1ページに表示されているデータ数 32 let from = page * perPage - perPage; //ページ数-1までに表示されるデータ数 33 let to = page * perPage; //1ページに表示されるデータ数 34 return streams.slice(from, to); 35 // 1ページ目ならfrom=0 to=10 で0~10までのデータを取得する 36 // 2ページ目ならfrom=10 to=20 で10~20までのデータを取得する 37 }, 38 // 表示するデータを抽出 39 displayStreams() { 40 return this.paginate(this.streams); 41 } 42 } 43}

error

1TypeError: streams.slice is not a function

streamsが配列でないため、sliceできないエラーかと思い、console.log(streams)でデータ内容を確認しようとしました。
出力結果がundifinedとなりデータが格納されているはずなのに表示されませんでした。
axiosの処理の部分でconsole.logを使うとstreamの中身が表示できていたため、データ自体は取得はできていると思います。
mounted内の処理で取得したデータはdata(){}で定義した変数に格納されていると思っているのですが、違うのでしょうか。

vuejs自体もAPIを使ったデータ取得も経験がなく、手詰まりとなってしまいました。
ヒントとなりそうなことであればどんなことでも構いませんので、ご回答いただけると幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

computedの使い方に誤りがあります。
computedは引数を取らないのと、paginateの最終行のstreamsにはthisが必要です。

vue

1 paginate() { 2 let page = this.page; //ページ数 3 let perPage = this.perPage; //1ページに表示されているデータ数 4 let from = page * perPage - perPage; //ページ数-1までに表示されるデータ数 5 let to = page * perPage; //1ページに表示されるデータ数 6 return this.streams.slice(from, to); 7 }

投稿2021/05/01 08:06

Masa-Shin

総合スコア269

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

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

Nako4

2021/05/01 23:10

Masa-Shin様 ご回答ありがとうございます。 computedの引数を外したところうまく動きました。 computedには引数はとらないんですね。 ありがとうございました。
guest

0

Vue は全く詳しくないので的外れでしたらすみません。

これが原因ではないですか?

要するにcomputedが最初に発火するとき、mountedまでに用意されない

ものを参照するとエラー吐くよ、という話です。
Vueライフサイクルの盲点、computedの一発目の発火はmountedより早い - Qiita

投稿2021/05/01 04:43

Lhankor_Mhy

総合スコア36104

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

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

Nako4

2021/05/01 07:09

Lhankor_Mhy様 ご回答ありがとうございます。 mountedをcreatedに変えてみましたが、全く同じエラーでした。 データ型が違う?というエラーだということでしたので、HTMLで{{ streams }}で表示させたところ[{AAA:AAA},{BBB:BBB},{CCC:CCC}]の形で表示できたので、型もあっているのでは?と思っています。
Lhankor_Mhy

2021/05/01 07:11

> mountedをcreatedに変えてみましたが、全く同じエラーでした。 そうなる、ということが、回答のリンク先にも書いてありますので、一読されてはいかがでしょうか?
Lhankor_Mhy

2021/05/01 07:11

ああ、失礼しました。非同期通信をcreatedにしたということですね。
Lhankor_Mhy

2021/05/01 07:23

> データ型が違う?というエラーだということ これはどなたかに指摘されたのですか? --- 個人的には、paginateの引数をどうやって渡しているのかな、という疑問があります。
Nako4

2021/05/01 23:16

Lhankor_Mhy様 ご返信ありがとうございます。 誰かに指摘されたわけではなく、Typeerrorがデータ型が違うエラーだという認識でした。 paginateの引数を...についてはそもそも引数は必要なかったようです。 conputedで引数を与えておかないとdataで定義した値が使えないのかと思っていたので引数を与えていました。 疑問に思われていることを私が理解できていないと思われるので、うまく説明することができていないと思うのですが。。。 一応実装自体はできました。 色々と考えるヒントをいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問