質問編集履歴

5

情報を追記

2020/02/23 09:53

投稿

take-t.t.
take-t.t.

スコア360

test CHANGED
@@ -1 +1 @@
1
- Vueでfirebaseでログインすると「Error in render: "RangeError: Maximum call stack size exceeded"」が発生してしまう
1
+ Vue.js】classのv-bindvuexのstateの値を参照すると「"RangeError: Maximum call stack size exceeded"」が発生する
test CHANGED
@@ -4,7 +4,9 @@
4
4
 
5
5
 
6
6
 
7
- 現在vue-cli3を使い開発を行っているのですが、firebaseグーグルアカウントでログインると「Error in render: "RangeError: Maximum call stack size exceeded"」というエラーメッセージとともにVueが止まってしまい、v-if等のディレクティブ効かなくなってしまいました。
7
+ 現在vue-cli3を使い開発を行っているのですが、firebaseを用いてグーグルアカウントでログインを行いページが切り替わると__Error in render: "RangeError: Maximum call stack size exceeded"__」というエラーメッセージとともにVueが止まってしまい、`v-bind`等のディレクティブ効かなくなってしまいました。
8
+
9
+
8
10
 
9
11
  consoleを見るにエラーメッセージが無限に増えていくので、以下のコード内で「何らかの処理」が無限に繰り返されているようです。
10
12
 
@@ -20,11 +22,29 @@
20
22
 
21
23
 
22
24
 
25
+ ###### **※追記**
26
+
27
+ `.home`と`.authentication__button`の2つの`class`の`v-bind`で、`loginUser`を参照している事が原因かもしれません。
28
+
29
+ 一つを消すと「__Error in render: "RangeError: Maximum call stack size exceeded"__」のメッセージ自体は出るものの、それも一度だけであり、無限ループは起きていませんでした。
30
+
31
+
32
+
33
+ 2つ以上すると無限ループするのでしょうか...?
34
+
35
+ 調べてもそこら辺りの情報は出てこず、結局分かりませんでした。
36
+
37
+
38
+
39
+ 詳しい方、よろしければご教授お願いいたします。
40
+
41
+
42
+
23
43
  ### 該当部分のコード
24
44
 
25
45
  ※Vuexのstateから読み込んでいる`loginUser`はログインした時にユーザー情報を格納する変数です。
26
46
 
27
- これを`v-if`で参照することでログイン・非ログイン時の表示を切り替えています。
47
+ これを`class`の`v-bind`と`computed`で参照するでログイン・非ログイン時の表示を切り替えています。
28
48
 
29
49
 
30
50
 
@@ -32,438 +52,324 @@
32
52
 
33
53
  <template>
34
54
 
55
+ <section class="home" :class="{'home--logged-in': loginUser}">
56
+
57
+ <div class="title">
58
+
59
+ <img class="title__logo" :src="require('@/assets/images/card-background.png')">
60
+
61
+ <div class="title__contents">
62
+
63
+ <h1 class="title__heading">Online Book Manager</h1>
64
+
65
+ <h2 class="title__ruby">読書記録が保存できるオンライン本棚</h2>
66
+
67
+ <p class="title__description">
68
+
69
+ <span v-html="usage.icon"></span>
70
+
71
+ {{ usage.description }}
72
+
73
+ </p>
74
+
75
+ </div>
76
+
77
+ </div>
78
+
79
+
80
+
81
+ <div class="authentication">
82
+
83
+ <p class="authentication__sentence">
84
+
85
+ <span v-html="instructions"></span>
86
+
87
+ </p>
88
+
89
+ <a
90
+
91
+ class="authentication__button"
92
+
93
+ :class="{'authentication__button--logged-in': loginUser}"
94
+
95
+ @click="authenticate"
96
+
97
+ >
98
+
99
+ <span v-html="authentication.icon"></span>
100
+
101
+ {{ authentication.processing }}
102
+
103
+ </a>
104
+
105
+ </div>
106
+
107
+ </section>
108
+
109
+ </template>
110
+
111
+ ```
112
+
113
+ ※mixinで読み込んでいる`authentication`はfirebaseのログインに関する処理です。
114
+
115
+ 処理自体はsweetalert2で`alert`を出して、それによりfirebaseの`login`・`logout`を実行するという単純なものです。
116
+
117
+ こちらは動いていた時から弄っていないので、今回は関係ないと思い詳しくは載せていません。
118
+
119
+
120
+
121
+ ```JavaScript
122
+
123
+ import { mapState } from 'vuex';
124
+
125
+ import { authentication } from '@/mixins/authentication';
126
+
127
+
128
+
129
+ export default {
130
+
131
+ name: 'home',
132
+
133
+ mixins: [authentication],
134
+
135
+ created() {
136
+
137
+ this.insertTag('Google');
138
+
139
+ },
140
+
141
+ data() {
142
+
143
+ return {
144
+
145
+ tag: '',
146
+
147
+ }
148
+
149
+ },
150
+
151
+ computed: {
152
+
153
+ usage() {
154
+
155
+ if(!this.loginUser) {
156
+
157
+ return {
158
+
159
+ icon: '<i class="fas fa-arrow-circle-down"></i>',
160
+
161
+ description: 'アプリの利用にはログインが必要です。'
162
+
163
+ }
164
+
165
+ } else {
166
+
167
+ return {
168
+
169
+ icon: '<i class="fas fa-arrow-circle-up"></i>',
170
+
171
+ description: '左上のタブから本を登録できます。'
172
+
173
+ }
174
+
175
+ }
176
+
177
+ },
178
+
179
+ instructions() {
180
+
181
+ return !this.loginUser ? `${this.tag}アカウントでOnline Book Managerにログインします。` : 'Online Book Managerからログアウトします。'
182
+
183
+ },
184
+
185
+ authentication() {
186
+
187
+ if(!this.loginUser) {
188
+
189
+ return {
190
+
191
+ icon: '<i class="fas fa-sign-in-alt"></i>',
192
+
193
+ processing: 'Sign in'
194
+
195
+ }
196
+
197
+ } else {
198
+
199
+ return {
200
+
201
+ icon: '<i class="fas fa-sign-out-alt"></i>',
202
+
203
+ processing: 'Sign out'
204
+
205
+ }
206
+
207
+ }
208
+
209
+ },
210
+
211
+ ...mapState(['loginUser']),
212
+
213
+ },
214
+
215
+ methods: {
216
+
217
+ insertTag(word) {
218
+
219
+ [...word].forEach((character, index) => {
220
+
221
+ this.tag += `<span class="insert${++index}">${character}</span>`;
222
+
223
+ })
224
+
225
+ },
226
+
227
+ authenticate() {
228
+
229
+ if(!this.loginUser) {
230
+
231
+ this.signIn();
232
+
233
+ } else {
234
+
235
+ this.signOut();
236
+
237
+ }
238
+
239
+ }
240
+
241
+ }
242
+
243
+ };
244
+
245
+ ```
246
+
247
+
248
+
249
+ ### 過去の動いていたコード
250
+
251
+ ※主な違いは、マスタッシュ構文を使って表示を切り替えているか、または`v-if`を使ってそれを行っているか。
252
+
253
+ その分のcssの変更を`class`の`v-bind`を使って行っているか否か、の2つです。
254
+
255
+
256
+
257
+ ```html
258
+
259
+ <template>
260
+
35
261
  <section class="home">
36
262
 
37
- <div class="home__wrapper" :class="{'home__wrapper--logged-in': loginUser}">
38
-
39
- <div class="title">
263
+ <div class="title">
40
-
41
- <img class="title__logo" :src="require('@/assets/images/card-background.png')">
264
+
42
-
43
- <div class="title__contents">
265
+ <div class="title__wrapper">
266
+
44
-
267
+ <h1 class="title__ruby">読書記録が保存できるオンライン本棚</h1>
268
+
45
- <h1 class="title__heading">Online Book Manager</h1>
269
+ <h1 class="title__heading">Online Book Manager</h1>
46
-
47
- <h2 class="title__ruby">読書記録が保存できるオンライン本棚</h2>
48
-
49
- <p class="title__description">
50
-
51
- <span v-html="usage.logo"></span>
52
-
53
- {{ usage.description }}
54
-
55
- </p>
56
-
57
- </div>
58
270
 
59
271
  </div>
60
272
 
61
-
62
-
63
- <div class="authentication">
273
+ <p class="title__description">
64
-
274
+
65
- <p class="authentication__sentence">
275
+ <template v-if="!loginUser">
276
+
66
-
277
+ <i class="fas fa-arrow-circle-right"></i><!-- PC -->
278
+
279
+ <i class="fas fa-arrow-circle-down"></i><!-- スマホータブレット -->
280
+
281
+ アプリの利用にはログインが必要です。
282
+
283
+ </template>
284
+
285
+ <template v-else>
286
+
67
- <span v-html="instructions"></span>
287
+ <i class="fas fa-arrow-circle-up"></i>
288
+
68
-
289
+ 左上のタブから本を登録できます。
290
+
291
+ </template>
292
+
69
- </p>
293
+ </p>
70
-
71
- <a
72
-
73
- class="authentication__button"
74
-
75
- :class="{'authentication__button--logged-in': loginUser}"
76
-
77
- @click="authenticate"
78
-
79
- >
80
-
81
- <span v-html="authentication.logo"></span>
82
-
83
- {{ authentication.processing }}
84
-
85
- </a>
86
-
87
- </div>
88
294
 
89
295
  </div>
90
296
 
297
+
298
+
299
+ <div class="authentication">
300
+
301
+ <p class="authentication__sentence">
302
+
303
+ <span class="sentence-title">
304
+
305
+ <template v-if="!loginUser">
306
+
307
+ <span v-html="tag"><!-- Google --></span>アカウントでログイン
308
+
309
+ </template>
310
+
311
+ <template v-else>
312
+
313
+ ログアウト
314
+
315
+ </template>
316
+
317
+ </span>
318
+
319
+ <span class="sentence-description">
320
+
321
+ <template v-if="!loginUser">
322
+
323
+ GoogleアカウントでOnline Book Managerにログインします。
324
+
325
+ </template>
326
+
327
+ <template v-else>
328
+
329
+ Online Book Managerからログアウトします。
330
+
331
+ </template>
332
+
333
+ </span>
334
+
335
+ </p>
336
+
337
+ <a
338
+
339
+ class="authentication__login-button"
340
+
341
+ v-if="!loginUser"
342
+
343
+ @click="loginProcessing"
344
+
345
+ >
346
+
347
+ <i class="fas fa-sign-in-alt"></i>
348
+
349
+ LOGIN
350
+
351
+ </a>
352
+
353
+ <a
354
+
355
+ class="authentication__logout-button"
356
+
357
+ v-else
358
+
359
+ @click="logoutProcessing"
360
+
361
+ >
362
+
363
+ <i class="fas fa-sign-out-alt"></i>
364
+
365
+ LOGOUT
366
+
367
+ </a>
368
+
369
+ </div>
370
+
91
371
  </section>
92
372
 
93
373
  </template>
94
374
 
95
375
  ```
96
-
97
- ※authentication.js内にある`this.$swal~`はvue-sweetalert2というライブラリです。`.then`で繋がっている`if(result.value)~`以降がalertでOKを押した場合の処理になります。
98
-
99
- そして`login`・`logout`はfirebaseのSDKのもの、`onLoading`は他コンポーネントにあるローディング画面を表示するための処理です。
100
-
101
- ただauthentication.jsのコードは弄っていないので、この部分は関係ないかもしれません。
102
-
103
-
104
-
105
- ```JavaScript
106
-
107
- import { mapState } from 'vuex';
108
-
109
- import { authentication } from '@/mixins/authentication';
110
-
111
-
112
-
113
- export default {
114
-
115
- name: 'home',
116
-
117
- mixins: [authentication],
118
-
119
- created() {
120
-
121
- this.insertTag('Google');
122
-
123
- },
124
-
125
- data() {
126
-
127
- return {
128
-
129
- tag: '',
130
-
131
- }
132
-
133
- },
134
-
135
- computed: {
136
-
137
- usage() {
138
-
139
- if(!this.loginUser) {
140
-
141
- return {
142
-
143
- logo: '<i class="fas fa-arrow-circle-down"></i>',
144
-
145
- description: 'アプリの利用にはログインが必要です。'
146
-
147
- }
148
-
149
- } else {
150
-
151
- return {
152
-
153
- logo: '<i class="fas fa-arrow-circle-up"></i>',
154
-
155
- description: '左上のタブから本を登録できます。'
156
-
157
- }
158
-
159
- }
160
-
161
- },
162
-
163
- instructions() {
164
-
165
- return !this.loginUser ? `${this.tag}アカウントでOnline Book Managerにログインします。` : 'Online Book Managerからログアウトします。'
166
-
167
- },
168
-
169
- authentication() {
170
-
171
- if(!this.loginUser) {
172
-
173
- return {
174
-
175
- logo: '<i class="fas fa-sign-in-alt"></i>',
176
-
177
- processing: 'Sign in'
178
-
179
- }
180
-
181
- } else {
182
-
183
- return {
184
-
185
- logo: '<i class="fas fa-sign-out-alt"></i>',
186
-
187
- processing: 'Sign out'
188
-
189
- }
190
-
191
- }
192
-
193
- },
194
-
195
- ...mapState(['loginUser']),
196
-
197
- },
198
-
199
- methods: {
200
-
201
- insertTag(word) {
202
-
203
- [...word].forEach((character, index) => {
204
-
205
- this.tag += `<span class="insert${++index}">${character}</span>`;
206
-
207
- })
208
-
209
- },
210
-
211
- authenticate() {
212
-
213
- if(!this.loginUser) {
214
-
215
- this.signIn();
216
-
217
- } else {
218
-
219
- this.signOut();
220
-
221
- }
222
-
223
- }
224
-
225
- }
226
-
227
- };
228
-
229
- ```
230
-
231
- ```JavaScript
232
-
233
- //authentication.js
234
-
235
- import { mapState, mapActions } from 'vuex';
236
-
237
-
238
-
239
- export const authentication = {
240
-
241
- computed: {
242
-
243
- ...mapState(['active'])
244
-
245
- },
246
-
247
- methods: {
248
-
249
- signIn() {
250
-
251
- this.$swal({
252
-
253
- type: 'question',
254
-
255
- title: 'Confirm',
256
-
257
- text: 'ログインしますか?',
258
-
259
- showCancelButton: true,
260
-
261
- showCloseButton: true,
262
-
263
- }).then(result => {
264
-
265
- if(result.value) {
266
-
267
- if(this.$route.name !== 'home') this.$router.push({name: 'home'});
268
-
269
- if(this.active) this.toggleDrawer();
270
-
271
- this.onLoading();
272
-
273
- this.login();
274
-
275
- }
276
-
277
- });
278
-
279
- },
280
-
281
- signOut() {
282
-
283
- this.$swal({
284
-
285
- type: 'question',
286
-
287
- title: 'Confirm',
288
-
289
- text: 'ログアウトしてもよろしいですか?',
290
-
291
- showCancelButton: true,
292
-
293
- showCloseButton: true,
294
-
295
- }).then(result => {
296
-
297
- if(result.value) {
298
-
299
- this.logout();
300
-
301
- if(this.$route.name !== 'home') this.$router.push({name: 'home'});
302
-
303
- this.onLoading();
304
-
305
- this.$swal({
306
-
307
- toast: true,
308
-
309
- position: 'top-end',
310
-
311
- type: 'success',
312
-
313
- title: 'ログアウトしました',
314
-
315
- showConfirmButton: false,
316
-
317
- timer: 1500,
318
-
319
- onAfterClose() {
320
-
321
- location.reload(true);
322
-
323
- }
324
-
325
- });
326
-
327
- }
328
-
329
- });
330
-
331
- },
332
-
333
- ...mapActions(['login', 'logout', 'onLoading', 'toggleDrawer'])
334
-
335
- }
336
-
337
- };
338
-
339
- ```
340
-
341
-
342
-
343
- ### 過去の動いていたコード
344
-
345
- ※主な違いは、マスタッシュ構文を使って表示を切り替えているか、または`v-if`を使ってそれを行っているか。
346
-
347
- `class`の`v-bind`を使っているか否か、の2つです。
348
-
349
-
350
-
351
- ```html
352
-
353
- <template>
354
-
355
- <section class="home">
356
-
357
- <div class="title">
358
-
359
- <div class="title__wrapper">
360
-
361
- <h1 class="title__ruby">読書記録が保存できるオンライン本棚</h1>
362
-
363
- <h1 class="title__heading">Online Book Manager</h1>
364
-
365
- </div>
366
-
367
- <p class="title__description">
368
-
369
- <template v-if="!loginUser">
370
-
371
- <i class="fas fa-arrow-circle-right"></i><!-- PC -->
372
-
373
- <i class="fas fa-arrow-circle-down"></i><!-- スマホータブレット -->
374
-
375
- アプリの利用にはログインが必要です。
376
-
377
- </template>
378
-
379
- <template v-else>
380
-
381
- <i class="fas fa-arrow-circle-up"></i>
382
-
383
- 左上のタブから本を登録できます。
384
-
385
- </template>
386
-
387
- </p>
388
-
389
- </div>
390
-
391
-
392
-
393
- <div class="authentication">
394
-
395
- <p class="authentication__sentence">
396
-
397
- <span class="sentence-title">
398
-
399
- <template v-if="!loginUser">
400
-
401
- <span v-html="tag"><!-- Google --></span>アカウントでログイン
402
-
403
- </template>
404
-
405
- <template v-else>
406
-
407
- ログアウト
408
-
409
- </template>
410
-
411
- </span>
412
-
413
- <span class="sentence-description">
414
-
415
- <template v-if="!loginUser">
416
-
417
- GoogleアカウントでOnline Book Managerにログインします。
418
-
419
- </template>
420
-
421
- <template v-else>
422
-
423
- Online Book Managerからログアウトします。
424
-
425
- </template>
426
-
427
- </span>
428
-
429
- </p>
430
-
431
- <a
432
-
433
- class="authentication__login-button"
434
-
435
- v-if="!loginUser"
436
-
437
- @click="loginProcessing"
438
-
439
- >
440
-
441
- <i class="fas fa-sign-in-alt"></i>
442
-
443
- LOGIN
444
-
445
- </a>
446
-
447
- <a
448
-
449
- class="authentication__logout-button"
450
-
451
- v-else
452
-
453
- @click="logoutProcessing"
454
-
455
- >
456
-
457
- <i class="fas fa-sign-out-alt"></i>
458
-
459
- LOGOUT
460
-
461
- </a>
462
-
463
- </div>
464
-
465
- </section>
466
-
467
- </template>
468
-
469
- ```

4

情報を追記

2020/02/23 09:53

投稿

take-t.t.
take-t.t.

スコア360

test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  いつもお世話になっております。
4
4
 
5
+
6
+
5
7
  現在vue-cli3を使い開発を行っているのですが、firebaseのグーグルアカウントでログインすると「Error in render: "RangeError: Maximum call stack size exceeded"」というエラーメッセージとともにVueが止まってしまい、v-if等のディレクティブ効かなくなってしまいました。
6
8
 
7
9
  consoleを見るにエラーメッセージが無限に増えていくので、以下のコード内で「何らかの処理」が無限に繰り返されているようです。
@@ -244,11 +246,7 @@
244
246
 
245
247
  methods: {
246
248
 
247
- loginProcessing() {
249
+ signIn() {
248
-
249
- if(this.$route.name !== 'home') this.$router.push({name: 'home'});
250
-
251
-
252
250
 
253
251
  this.$swal({
254
252
 
@@ -266,10 +264,10 @@
266
264
 
267
265
  if(result.value) {
268
266
 
267
+ if(this.$route.name !== 'home') this.$router.push({name: 'home'});
268
+
269
269
  if(this.active) this.toggleDrawer();
270
270
 
271
-
272
-
273
271
  this.onLoading();
274
272
 
275
273
  this.login();
@@ -280,7 +278,7 @@
280
278
 
281
279
  },
282
280
 
283
- logoutProcessing() {
281
+ signOut() {
284
282
 
285
283
  this.$swal({
286
284
 
@@ -344,7 +342,11 @@
344
342
 
345
343
  ### 過去の動いていたコード
346
344
 
347
- ※主な違いは、2つの`aグ`でログインボタンの`authentication__login-button`と`authentication__logout-button`を`v-if`・`v-else`しいたか、一つの`aタグ`内でそれを行っているかです
345
+ ※主な違いは、マスッシュ構文使って表示を切り替えているか、または`v-if`を使ってそれを行っているか。
346
+
347
+ `class`の`v-bind`を使っているか否か、の2つです。
348
+
349
+
348
350
 
349
351
  ```html
350
352
 

3

コードを編集

2020/02/22 20:18

投稿

take-t.t.
take-t.t.

スコア360

test CHANGED
File without changes
test CHANGED
@@ -46,21 +46,9 @@
46
46
 
47
47
  <p class="title__description">
48
48
 
49
- <template v-if="!loginUser">
50
-
51
- <i class="fas fa-arrow-circle-down"></i>
52
-
53
- アプリの利用にはログインが必要です。
54
-
55
- </template>
56
-
57
- <template v-else>
58
-
59
- <i class="fas fa-arrow-circle-up"></i>
49
+ <span v-html="usage.logo"></span>
60
-
61
- 左上のタブから本を登録できます。
50
+
62
-
63
- </template>
51
+ {{ usage.description }}
64
52
 
65
53
  </p>
66
54
 
@@ -74,49 +62,401 @@
74
62
 
75
63
  <p class="authentication__sentence">
76
64
 
65
+ <span v-html="instructions"></span>
66
+
67
+ </p>
68
+
69
+ <a
70
+
71
+ class="authentication__button"
72
+
73
+ :class="{'authentication__button--logged-in': loginUser}"
74
+
75
+ @click="authenticate"
76
+
77
+ >
78
+
79
+ <span v-html="authentication.logo"></span>
80
+
81
+ {{ authentication.processing }}
82
+
83
+ </a>
84
+
85
+ </div>
86
+
87
+ </div>
88
+
89
+ </section>
90
+
91
+ </template>
92
+
93
+ ```
94
+
95
+ ※authentication.js内にある`this.$swal~`はvue-sweetalert2というライブラリです。`.then`で繋がっている`if(result.value)~`以降がalertでOKを押した場合の処理になります。
96
+
97
+ そして`login`・`logout`はfirebaseのSDKのもの、`onLoading`は他コンポーネントにあるローディング画面を表示するための処理です。
98
+
99
+ ただauthentication.jsのコードは弄っていないので、この部分は関係ないかもしれません。
100
+
101
+
102
+
103
+ ```JavaScript
104
+
105
+ import { mapState } from 'vuex';
106
+
107
+ import { authentication } from '@/mixins/authentication';
108
+
109
+
110
+
111
+ export default {
112
+
113
+ name: 'home',
114
+
115
+ mixins: [authentication],
116
+
117
+ created() {
118
+
119
+ this.insertTag('Google');
120
+
121
+ },
122
+
123
+ data() {
124
+
125
+ return {
126
+
127
+ tag: '',
128
+
129
+ }
130
+
131
+ },
132
+
133
+ computed: {
134
+
135
+ usage() {
136
+
137
+ if(!this.loginUser) {
138
+
139
+ return {
140
+
141
+ logo: '<i class="fas fa-arrow-circle-down"></i>',
142
+
143
+ description: 'アプリの利用にはログインが必要です。'
144
+
145
+ }
146
+
147
+ } else {
148
+
149
+ return {
150
+
151
+ logo: '<i class="fas fa-arrow-circle-up"></i>',
152
+
153
+ description: '左上のタブから本を登録できます。'
154
+
155
+ }
156
+
157
+ }
158
+
159
+ },
160
+
161
+ instructions() {
162
+
163
+ return !this.loginUser ? `${this.tag}アカウントでOnline Book Managerにログインします。` : 'Online Book Managerからログアウトします。'
164
+
165
+ },
166
+
167
+ authentication() {
168
+
169
+ if(!this.loginUser) {
170
+
171
+ return {
172
+
173
+ logo: '<i class="fas fa-sign-in-alt"></i>',
174
+
175
+ processing: 'Sign in'
176
+
177
+ }
178
+
179
+ } else {
180
+
181
+ return {
182
+
183
+ logo: '<i class="fas fa-sign-out-alt"></i>',
184
+
185
+ processing: 'Sign out'
186
+
187
+ }
188
+
189
+ }
190
+
191
+ },
192
+
193
+ ...mapState(['loginUser']),
194
+
195
+ },
196
+
197
+ methods: {
198
+
199
+ insertTag(word) {
200
+
201
+ [...word].forEach((character, index) => {
202
+
203
+ this.tag += `<span class="insert${++index}">${character}</span>`;
204
+
205
+ })
206
+
207
+ },
208
+
209
+ authenticate() {
210
+
211
+ if(!this.loginUser) {
212
+
213
+ this.signIn();
214
+
215
+ } else {
216
+
217
+ this.signOut();
218
+
219
+ }
220
+
221
+ }
222
+
223
+ }
224
+
225
+ };
226
+
227
+ ```
228
+
229
+ ```JavaScript
230
+
231
+ //authentication.js
232
+
233
+ import { mapState, mapActions } from 'vuex';
234
+
235
+
236
+
237
+ export const authentication = {
238
+
239
+ computed: {
240
+
241
+ ...mapState(['active'])
242
+
243
+ },
244
+
245
+ methods: {
246
+
247
+ loginProcessing() {
248
+
249
+ if(this.$route.name !== 'home') this.$router.push({name: 'home'});
250
+
251
+
252
+
253
+ this.$swal({
254
+
255
+ type: 'question',
256
+
257
+ title: 'Confirm',
258
+
259
+ text: 'ログインしますか?',
260
+
261
+ showCancelButton: true,
262
+
263
+ showCloseButton: true,
264
+
265
+ }).then(result => {
266
+
267
+ if(result.value) {
268
+
269
+ if(this.active) this.toggleDrawer();
270
+
271
+
272
+
273
+ this.onLoading();
274
+
275
+ this.login();
276
+
277
+ }
278
+
279
+ });
280
+
281
+ },
282
+
283
+ logoutProcessing() {
284
+
285
+ this.$swal({
286
+
287
+ type: 'question',
288
+
289
+ title: 'Confirm',
290
+
291
+ text: 'ログアウトしてもよろしいですか?',
292
+
293
+ showCancelButton: true,
294
+
295
+ showCloseButton: true,
296
+
297
+ }).then(result => {
298
+
299
+ if(result.value) {
300
+
301
+ this.logout();
302
+
303
+ if(this.$route.name !== 'home') this.$router.push({name: 'home'});
304
+
305
+ this.onLoading();
306
+
307
+ this.$swal({
308
+
309
+ toast: true,
310
+
311
+ position: 'top-end',
312
+
313
+ type: 'success',
314
+
315
+ title: 'ログアウトしました',
316
+
317
+ showConfirmButton: false,
318
+
319
+ timer: 1500,
320
+
321
+ onAfterClose() {
322
+
323
+ location.reload(true);
324
+
325
+ }
326
+
327
+ });
328
+
329
+ }
330
+
331
+ });
332
+
333
+ },
334
+
335
+ ...mapActions(['login', 'logout', 'onLoading', 'toggleDrawer'])
336
+
337
+ }
338
+
339
+ };
340
+
341
+ ```
342
+
343
+
344
+
345
+ ### 過去の動いていたコード
346
+
347
+ ※主な違いは、2つの`aタグ`でログインボタンの`authentication__login-button`と`authentication__logout-button`を`v-if`・`v-else`していたか、一つの`aタグ`内でそれを行っているかです。
348
+
349
+ ```html
350
+
351
+ <template>
352
+
353
+ <section class="home">
354
+
355
+ <div class="title">
356
+
357
+ <div class="title__wrapper">
358
+
359
+ <h1 class="title__ruby">読書記録が保存できるオンライン本棚</h1>
360
+
361
+ <h1 class="title__heading">Online Book Manager</h1>
362
+
363
+ </div>
364
+
365
+ <p class="title__description">
366
+
367
+ <template v-if="!loginUser">
368
+
369
+ <i class="fas fa-arrow-circle-right"></i><!-- PC -->
370
+
371
+ <i class="fas fa-arrow-circle-down"></i><!-- スマホータブレット -->
372
+
373
+ アプリの利用にはログインが必要です。
374
+
375
+ </template>
376
+
377
+ <template v-else>
378
+
379
+ <i class="fas fa-arrow-circle-up"></i>
380
+
381
+ 左上のタブから本を登録できます。
382
+
383
+ </template>
384
+
385
+ </p>
386
+
387
+ </div>
388
+
389
+
390
+
391
+ <div class="authentication">
392
+
393
+ <p class="authentication__sentence">
394
+
395
+ <span class="sentence-title">
396
+
77
397
  <template v-if="!loginUser">
78
398
 
79
- <span v-html="tag"><!-- Google --></span>アカウントでOnline Book Managerにログインします。
399
+ <span v-html="tag"><!-- Google --></span>アカウントでログイン
80
400
 
81
401
  </template>
82
402
 
83
403
  <template v-else>
84
404
 
405
+ ログアウト
406
+
407
+ </template>
408
+
409
+ </span>
410
+
411
+ <span class="sentence-description">
412
+
413
+ <template v-if="!loginUser">
414
+
415
+ GoogleアカウントでOnline Book Managerにログインします。
416
+
417
+ </template>
418
+
419
+ <template v-else>
420
+
85
421
  Online Book Managerからログアウトします。
86
422
 
87
423
  </template>
88
424
 
425
+ </span>
426
+
89
- </p>
427
+ </p>
90
-
428
+
91
- <a
429
+ <a
92
-
430
+
93
- class="authentication__button"
431
+ class="authentication__login-button"
94
-
432
+
95
- :class="{'authentication__button--logged-in': loginUser}"
433
+ v-if="!loginUser"
96
-
434
+
97
- @click="authenticationProcessing"
435
+ @click="loginProcessing"
98
-
436
+
99
- >
437
+ >
100
-
101
- <template v-if="!loginUser">
438
+
102
-
103
- <i class="fas fa-sign-in-alt"></i>
439
+ <i class="fas fa-sign-in-alt"></i>
104
-
440
+
105
- Sign in
441
+ LOGIN
106
-
442
+
107
- </template>
443
+ </a>
444
+
108
-
445
+ <a
446
+
447
+ class="authentication__logout-button"
448
+
449
+ v-else
450
+
109
- <template v-else>
451
+ @click="logoutProcessing"
452
+
110
-
453
+ >
454
+
111
- <i class="fas fa-sign-out-alt"></i>
455
+ <i class="fas fa-sign-out-alt"></i>
112
-
456
+
113
- Sign out
457
+ LOGOUT
114
-
115
- </template>
458
+
116
-
117
- </a>
459
+ </a>
118
-
119
- </div>
120
460
 
121
461
  </div>
122
462
 
@@ -125,319 +465,3 @@
125
465
  </template>
126
466
 
127
467
  ```
128
-
129
- ※authentication.js内にある`this.$swal~`はvue-sweetalert2というライブラリです。`.then`で繋がっている`if(result.value)~`以降がalertでOKを押した場合の処理になります。
130
-
131
- そして`login`・`logout`はfirebaseのSDKのもの、`onLoading`は他コンポーネントにあるローディング画面を表示するための処理です。
132
-
133
- ただauthentication.jsのコードは弄っていないので、この部分は関係ないかもしれません。
134
-
135
-
136
-
137
- ```JavaScript
138
-
139
- import { mapState } from 'vuex';
140
-
141
- import { authentication } from '@/mixins/authentication';
142
-
143
-
144
-
145
- export default {
146
-
147
- name: 'home',
148
-
149
- mixins: [authentication],
150
-
151
- created() {
152
-
153
- this.insertTag('Google');
154
-
155
- },
156
-
157
- data() {
158
-
159
- return {
160
-
161
- tag: '',
162
-
163
- }
164
-
165
- },
166
-
167
- computed: {
168
-
169
- ...mapState(['loginUser']),
170
-
171
- },
172
-
173
- methods: {
174
-
175
- insertTag(word) {
176
-
177
- [...word].forEach((character, index) => {
178
-
179
- this.tag += `<span class="insert${++index}">${character}</span>`;
180
-
181
- })
182
-
183
- },
184
-
185
- authenticationProcessing() {
186
-
187
- if(!this.loginUser) {
188
-
189
- this.loginProcessing();
190
-
191
- } else {
192
-
193
- this.logoutProcessing();
194
-
195
- }
196
-
197
- }
198
-
199
- }
200
-
201
- };
202
-
203
- ```
204
-
205
- ```JavaScript
206
-
207
- //authentication.js
208
-
209
- import { mapState, mapActions } from 'vuex';
210
-
211
-
212
-
213
- export const authentication = {
214
-
215
- computed: {
216
-
217
- ...mapState(['active'])
218
-
219
- },
220
-
221
- methods: {
222
-
223
- loginProcessing() {
224
-
225
- if(this.$route.name !== 'home') this.$router.push({name: 'home'});
226
-
227
-
228
-
229
- this.$swal({
230
-
231
- type: 'question',
232
-
233
- title: 'Confirm',
234
-
235
- text: 'ログインしますか?',
236
-
237
- showCancelButton: true,
238
-
239
- showCloseButton: true,
240
-
241
- }).then(result => {
242
-
243
- if(result.value) {
244
-
245
- if(this.active) this.toggleDrawer();
246
-
247
-
248
-
249
- this.onLoading();
250
-
251
- this.login();
252
-
253
- }
254
-
255
- });
256
-
257
- },
258
-
259
- logoutProcessing() {
260
-
261
- this.$swal({
262
-
263
- type: 'question',
264
-
265
- title: 'Confirm',
266
-
267
- text: 'ログアウトしてもよろしいですか?',
268
-
269
- showCancelButton: true,
270
-
271
- showCloseButton: true,
272
-
273
- }).then(result => {
274
-
275
- if(result.value) {
276
-
277
- this.logout();
278
-
279
- if(this.$route.name !== 'home') this.$router.push({name: 'home'});
280
-
281
- this.onLoading();
282
-
283
- this.$swal({
284
-
285
- toast: true,
286
-
287
- position: 'top-end',
288
-
289
- type: 'success',
290
-
291
- title: 'ログアウトしました',
292
-
293
- showConfirmButton: false,
294
-
295
- timer: 1500,
296
-
297
- onAfterClose() {
298
-
299
- location.reload(true);
300
-
301
- }
302
-
303
- });
304
-
305
- }
306
-
307
- });
308
-
309
- },
310
-
311
- ...mapActions(['login', 'logout', 'onLoading', 'toggleDrawer'])
312
-
313
- }
314
-
315
- };
316
-
317
- ```
318
-
319
-
320
-
321
- ### 過去の動いていたコード
322
-
323
- ※主な違いは、2つの`aタグ`でログインボタンの`authentication__login-button`と`authentication__logout-button`を`v-if`・`v-else`していたか、一つの`aタグ`内でそれを行っているかです。
324
-
325
- ```html
326
-
327
- <template>
328
-
329
- <section class="home">
330
-
331
- <div class="title">
332
-
333
- <div class="title__wrapper">
334
-
335
- <h1 class="title__ruby">読書記録が保存できるオンライン本棚</h1>
336
-
337
- <h1 class="title__heading">Online Book Manager</h1>
338
-
339
- </div>
340
-
341
- <p class="title__description">
342
-
343
- <template v-if="!loginUser">
344
-
345
- <i class="fas fa-arrow-circle-right"></i><!-- PC -->
346
-
347
- <i class="fas fa-arrow-circle-down"></i><!-- スマホータブレット -->
348
-
349
- アプリの利用にはログインが必要です。
350
-
351
- </template>
352
-
353
- <template v-else>
354
-
355
- <i class="fas fa-arrow-circle-up"></i>
356
-
357
- 左上のタブから本を登録できます。
358
-
359
- </template>
360
-
361
- </p>
362
-
363
- </div>
364
-
365
-
366
-
367
- <div class="authentication">
368
-
369
- <p class="authentication__sentence">
370
-
371
- <span class="sentence-title">
372
-
373
- <template v-if="!loginUser">
374
-
375
- <span v-html="tag"><!-- Google --></span>アカウントでログイン
376
-
377
- </template>
378
-
379
- <template v-else>
380
-
381
- ログアウト
382
-
383
- </template>
384
-
385
- </span>
386
-
387
- <span class="sentence-description">
388
-
389
- <template v-if="!loginUser">
390
-
391
- GoogleアカウントでOnline Book Managerにログインします。
392
-
393
- </template>
394
-
395
- <template v-else>
396
-
397
- Online Book Managerからログアウトします。
398
-
399
- </template>
400
-
401
- </span>
402
-
403
- </p>
404
-
405
- <a
406
-
407
- class="authentication__login-button"
408
-
409
- v-if="!loginUser"
410
-
411
- @click="loginProcessing"
412
-
413
- >
414
-
415
- <i class="fas fa-sign-in-alt"></i>
416
-
417
- LOGIN
418
-
419
- </a>
420
-
421
- <a
422
-
423
- class="authentication__logout-button"
424
-
425
- v-else
426
-
427
- @click="logoutProcessing"
428
-
429
- >
430
-
431
- <i class="fas fa-sign-out-alt"></i>
432
-
433
- LOGOUT
434
-
435
- </a>
436
-
437
- </div>
438
-
439
- </section>
440
-
441
- </template>
442
-
443
- ```

2

情報を追記

2020/02/22 20:05

投稿

take-t.t.
take-t.t.

スコア360

test CHANGED
File without changes
test CHANGED
@@ -4,11 +4,13 @@
4
4
 
5
5
  現在vue-cli3を使い開発を行っているのですが、firebaseのグーグルアカウントでログインすると「Error in render: "RangeError: Maximum call stack size exceeded"」というエラーメッセージとともにVueが止まってしまい、v-if等のディレクティブ効かなくなってしまいました。
6
6
 
7
- consoleを見るにエラーメッセージが無限に増えていくので、以下のコード内で「何かの処理」が無限に繰り返されているようです。
7
+ consoleを見るにエラーメッセージが無限に増えていくので、以下のコード内で「何かの処理」が無限に繰り返されているようです。
8
+
8
-
9
+ ログイン中のみ起こっており、ログアウトするか別のページに切り替えると収まります。
9
-
10
-
10
+
11
+
12
+
11
- かし再帰関数はありませんし、Vue Devtoolsで確認しても特にコンポーネント内の関数が無限に実行されている形跡はなく、自分で見る限りでは問題を発見できませんでした。
13
+ 原因を解明ようにも再帰関数はありませんし、Vue Devtoolsで確認しても特にコンポーネント内の関数が無限に実行されている形跡はなく、自分で見る限りでは問題を発見できませんでした。
12
14
 
13
15
 
14
16
 

1

情報を追記

2020/02/22 18:00

投稿

take-t.t.
take-t.t.

スコア360

test CHANGED
File without changes
test CHANGED
@@ -313,3 +313,129 @@
313
313
  };
314
314
 
315
315
  ```
316
+
317
+
318
+
319
+ ### 過去の動いていたコード
320
+
321
+ ※主な違いは、2つの`aタグ`でログインボタンの`authentication__login-button`と`authentication__logout-button`を`v-if`・`v-else`していたか、一つの`aタグ`内でそれを行っているかです。
322
+
323
+ ```html
324
+
325
+ <template>
326
+
327
+ <section class="home">
328
+
329
+ <div class="title">
330
+
331
+ <div class="title__wrapper">
332
+
333
+ <h1 class="title__ruby">読書記録が保存できるオンライン本棚</h1>
334
+
335
+ <h1 class="title__heading">Online Book Manager</h1>
336
+
337
+ </div>
338
+
339
+ <p class="title__description">
340
+
341
+ <template v-if="!loginUser">
342
+
343
+ <i class="fas fa-arrow-circle-right"></i><!-- PC -->
344
+
345
+ <i class="fas fa-arrow-circle-down"></i><!-- スマホータブレット -->
346
+
347
+ アプリの利用にはログインが必要です。
348
+
349
+ </template>
350
+
351
+ <template v-else>
352
+
353
+ <i class="fas fa-arrow-circle-up"></i>
354
+
355
+ 左上のタブから本を登録できます。
356
+
357
+ </template>
358
+
359
+ </p>
360
+
361
+ </div>
362
+
363
+
364
+
365
+ <div class="authentication">
366
+
367
+ <p class="authentication__sentence">
368
+
369
+ <span class="sentence-title">
370
+
371
+ <template v-if="!loginUser">
372
+
373
+ <span v-html="tag"><!-- Google --></span>アカウントでログイン
374
+
375
+ </template>
376
+
377
+ <template v-else>
378
+
379
+ ログアウト
380
+
381
+ </template>
382
+
383
+ </span>
384
+
385
+ <span class="sentence-description">
386
+
387
+ <template v-if="!loginUser">
388
+
389
+ GoogleアカウントでOnline Book Managerにログインします。
390
+
391
+ </template>
392
+
393
+ <template v-else>
394
+
395
+ Online Book Managerからログアウトします。
396
+
397
+ </template>
398
+
399
+ </span>
400
+
401
+ </p>
402
+
403
+ <a
404
+
405
+ class="authentication__login-button"
406
+
407
+ v-if="!loginUser"
408
+
409
+ @click="loginProcessing"
410
+
411
+ >
412
+
413
+ <i class="fas fa-sign-in-alt"></i>
414
+
415
+ LOGIN
416
+
417
+ </a>
418
+
419
+ <a
420
+
421
+ class="authentication__logout-button"
422
+
423
+ v-else
424
+
425
+ @click="logoutProcessing"
426
+
427
+ >
428
+
429
+ <i class="fas fa-sign-out-alt"></i>
430
+
431
+ LOGOUT
432
+
433
+ </a>
434
+
435
+ </div>
436
+
437
+ </section>
438
+
439
+ </template>
440
+
441
+ ```