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

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

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

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

2735閲覧

Vue.jsで値を入れたはずのオブジェクトがundefinedでエラーになる(再読み込みすると直る)

NulluoKikiura

総合スコア34

Vue.js

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

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2021/10/09 15:04

概要

Vue/Nuxt + TypeScriptでフロントエンド開発をしています。
プロパティに値をセットしたときに、セットするタイミングが悪いのか、またはセットの仕方が悪いのか
値を読みに行った時にundefinedエラーが出ます。

発生している現象

下記のコードでプロパティpetInfoにサーバから取得したデータを格納しています。

private petInfo: { cats: { catId: string catName: string }[] }={cats:[]} public async _mounted() { this.$nextTick(() => {this.$nuxt.$loading.start()}) try {this.$nextTick(() => { // 省略 }) await this.displayPage() } catch (e) { this.$nuxt.$loading.finish() // エラー処理 return } } private async displayPage() { await this.getServerData() const targetCat = this.petInfo.cats.filter(cat => cat.catName === "タマ" )[0] // => ここでthis.petInfo.cats.filter(~)の結果が // undefinedなのでエラーになる } // サーバからデータを取得して条件に合うものをthis.petInfoに入れる private async getServerData(){ const prettyCatsList=["タマ","ミケ","クロ"] const apiResponse = await getNyankoInfo() // ↑ APIを投げてサーバから情報を取得する関数 // apiResponse.catsにpetInfoと同じ型のデータが入る //ここでpetInfoにデータをセット…しているのだが。。。 this.petInfo={cats:apiResponse.cats.filter(cat=>prettyCatsList.includes(cat.catName))} }

このコードを実行するとdisplayPageメソッドの最後の行で
TypeError: this.petInfo.cats.filter(...)[0] is undefinedが発生します。
しかし、エラーが発生した後、画面をリロードするとundefinedエラーは発生せず、ちゃんとpetInfoにデータが入ってくれます。
そのため、値をセットするタイミングよりも何故か先に値を参照しにいっているのだと推測されるのですが、参照前に値をセットする方法がわかりません。(awaitをかけているので、getServerDataでサーバからデータ取得された後にpetInfoを参照していると思うのですが、にも関わらずundefinedエラーになる理由も不明です)

試したこと

Vue.jsでビューの変更がされないときに疑うこと+主な解決策方法- Qiita
↑の情報を参考にした結果、下記のコードの書き方が悪いのかと思い、修正を試みました。

this.petInfo={cats:apiResponse.cats.filter(cat=>prettyCatsList.includes(cat.catName))}

しかし、下記の2パターンに書き直して動作確認しましたが現象に変化ありませんでした。

// パターン(1) pushを使ってみる apiResponse.cats.forEach(cat=>{ if(prettyCatsList.includes(cat.catName)){ this.petInfo.cats.push(cat) } }) // パターン(2) $setを使ってみる this.$set(this.petInfo,"cats",apiResponse.cats.filter(cat=>prettyCatsList.includes(cat.catName)))

また、ブラウザの開発者ツールで確認するとAPIの返り値は想定通りの値が帰ってきているのでAPI側の問題でもなさそうです。

試したことは以上です。どなたかTypeScriptやVueにお詳しい方の情報お待ちしております。よろしくお願いいたします。

環境

@nuxt/cli v2.15.8
vue@2.6.14

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

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

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

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

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

ukyoda

2021/10/09 15:46

> petInfoにサーバから取得したデータを格納しています。 この、petInfoに値にはどうやってセットされるのでしょうか? `this.$nuxt.$loading.start()`ですか?それとも親コンポーネントからプロパティで渡される?
ukyoda

2021/10/09 15:47 編集

あっ、すみません。ちゃんと読めてませんでした; getServerDataですね;
guest

回答1

0

自己解決

すみません、単純にTypeScriptのコードのロジックがバグっていて、APIから受け取った値をfilterする時の条件が間違っていて絞り込み結果が0件になっていただけでした

VueやNuxt関連のバグかと思ったのですが、まったくそうではなかったです。お騒がせして申し訳ありません。

投稿2021/10/11 13:21

NulluoKikiura

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問