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

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

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

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

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

0回答

515閲覧

【Vue.js】classのv-bindでvuexのstateの値を参照すると「"RangeError: Maximum call stack size exceeded"」が発生する

take-t.t.

総合スコア360

Vue.js

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

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/02/22 15:47

編集2020/02/23 09:53

前提・実現したいこと

いつもお世話になっております。

現在vue-cli3を使い開発を行っているのですが、firebaseを用いてグーグルアカウントでログインを行いページが切り替わると、「Error in render: "RangeError: Maximum call stack size exceeded"」というエラーメッセージとともにVueが止まってしまい、v-bind等のディレクティブが効かなくなってしまいました。

consoleを見るにエラーメッセージが無限に増えていくので、以下のコード内で「何らかの処理」が無限に繰り返されているようです。
ログイン中のみ起こっており、ログアウトするか別のページに切り替えると収まります。

原因を解明しようにも再帰関数はありませんし、Vue Devtoolsで確認しても特にコンポーネント内の関数が無限に実行されている形跡はなく、自分で見る限りでは問題を発見できませんでした。

完全に手詰まりになっています、どうか皆様お力添えをお願いいたします。

※追記

.home.authentication__buttonの2つのclassv-bindで、loginUserを参照している事が原因かもしれません。
一つを消すと「Error in render: "RangeError: Maximum call stack size exceeded"」のメッセージ自体は出るものの、それも一度だけであり、無限ループは起きていませんでした。

2つ以上すると無限ループするのでしょうか...?
調べてもそこら辺りの情報は出てこず、結局分かりませんでした。

詳しい方、よろしければご教授お願いいたします。

該当部分のコード

※Vuexのstateから読み込んでいるloginUserはログインした時にユーザー情報を格納する変数です。
これをclassv-bindcomputedで参照する事でログイン・非ログイン時の表示を切り替えています。

html

1<template> 2 <section class="home" :class="{'home--logged-in': loginUser}"> 3 <div class="title"> 4 <img class="title__logo" :src="require('@/assets/images/card-background.png')"> 5 <div class="title__contents"> 6 <h1 class="title__heading">Online Book Manager</h1> 7 <h2 class="title__ruby">読書記録が保存できるオンライン本棚</h2> 8 <p class="title__description"> 9 <span v-html="usage.icon"></span> 10 {{ usage.description }} 11 </p> 12 </div> 13 </div> 14 15 <div class="authentication"> 16 <p class="authentication__sentence"> 17 <span v-html="instructions"></span> 18 </p> 19 <a 20 class="authentication__button" 21 :class="{'authentication__button--logged-in': loginUser}" 22 @click="authenticate" 23 > 24 <span v-html="authentication.icon"></span> 25 {{ authentication.processing }} 26 </a> 27 </div> 28 </section> 29</template>

※mixinで読み込んでいるauthenticationはfirebaseのログインに関する処理です。
処理自体はsweetalert2でalertを出して、それによりfirebaseのloginlogoutを実行するという単純なものです。
こちらは動いていた時から弄っていないので、今回は関係ないと思い詳しくは載せていません。

JavaScript

1import { mapState } from 'vuex'; 2import { authentication } from '@/mixins/authentication'; 3 4export default { 5 name: 'home', 6 mixins: [authentication], 7 created() { 8 this.insertTag('Google'); 9 }, 10 data() { 11 return { 12 tag: '', 13 } 14 }, 15 computed: { 16 usage() { 17 if(!this.loginUser) { 18 return { 19 icon: '<i class="fas fa-arrow-circle-down"></i>', 20 description: 'アプリの利用にはログインが必要です。' 21 } 22 } else { 23 return { 24 icon: '<i class="fas fa-arrow-circle-up"></i>', 25 description: '左上のタブから本を登録できます。' 26 } 27 } 28 }, 29 instructions() { 30 return !this.loginUser ? `${this.tag}アカウントでOnline Book Managerにログインします。` : 'Online Book Managerからログアウトします。' 31 }, 32 authentication() { 33 if(!this.loginUser) { 34 return { 35 icon: '<i class="fas fa-sign-in-alt"></i>', 36 processing: 'Sign in' 37 } 38 } else { 39 return { 40 icon: '<i class="fas fa-sign-out-alt"></i>', 41 processing: 'Sign out' 42 } 43 } 44 }, 45 ...mapState(['loginUser']), 46 }, 47 methods: { 48 insertTag(word) { 49 [...word].forEach((character, index) => { 50 this.tag += `<span class="insert${++index}">${character}</span>`; 51 }) 52 }, 53 authenticate() { 54 if(!this.loginUser) { 55 this.signIn(); 56 } else { 57 this.signOut(); 58 } 59 } 60 } 61};

過去の動いていたコード

※主な違いは、マスタッシュ構文を使って表示を切り替えているか、またはv-ifを使ってそれを行っているか。
その分のcssの変更をclassv-bindを使って行っているか否か、の2つです。

html

1<template> 2 <section class="home"> 3 <div class="title"> 4 <div class="title__wrapper"> 5 <h1 class="title__ruby">読書記録が保存できるオンライン本棚</h1> 6 <h1 class="title__heading">Online Book Manager</h1> 7 </div> 8 <p class="title__description"> 9 <template v-if="!loginUser"> 10 <i class="fas fa-arrow-circle-right"></i><!-- PC --> 11 <i class="fas fa-arrow-circle-down"></i><!-- スマホータブレット --> 12 アプリの利用にはログインが必要です。 13 </template> 14 <template v-else> 15 <i class="fas fa-arrow-circle-up"></i> 16 左上のタブから本を登録できます。 17 </template> 18 </p> 19 </div> 20 21 <div class="authentication"> 22 <p class="authentication__sentence"> 23 <span class="sentence-title"> 24 <template v-if="!loginUser"> 25 <span v-html="tag"><!-- Google --></span>アカウントでログイン 26 </template> 27 <template v-else> 28 ログアウト 29 </template> 30 </span> 31 <span class="sentence-description"> 32 <template v-if="!loginUser"> 33 GoogleアカウントでOnline Book Managerにログインします。 34 </template> 35 <template v-else> 36 Online Book Managerからログアウトします。 37 </template> 38 </span> 39 </p> 40 <a 41 class="authentication__login-button" 42 v-if="!loginUser" 43 @click="loginProcessing" 44 > 45 <i class="fas fa-sign-in-alt"></i> 46 LOGIN 47 </a> 48 <a 49 class="authentication__logout-button" 50 v-else 51 @click="logoutProcessing" 52 > 53 <i class="fas fa-sign-out-alt"></i> 54 LOGOUT 55 </a> 56 </div> 57 </section> 58</template>

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問