質問編集履歴

1

コメントの追加

2020/12/18 08:56

投稿

kobaryo04ysh
kobaryo04ysh

スコア29

test CHANGED
File without changes
test CHANGED
@@ -411,3 +411,91 @@
411
411
 
412
412
 
413
413
  ご回答お待ちしております。
414
+
415
+
416
+
417
+ ## 追記
418
+
419
+ useEffect内にてリスナーのデタッチのためのunsbscribeをreturnしていますが、ご指摘いただいた通り、returnを消して`unsubscribe()`だけに変更したらレンダリングが抑えられる様になりました。
420
+
421
+
422
+
423
+ しかしながら、時間が経って再びconsoleに出力すると、直す前と変わらず無限にレンダリングがされてしまっていました。その上で、リアルタイムのコメントの反映もされなくなってしまったので、`onSnapshot((snapshots) => {})`の外に`return unsubscribe;`とすることで、リアルタイムのコメントの反映の部分は直ったのですが、依然として無限にレンダリングされる現象が直りません。
424
+
425
+
426
+
427
+ ```CommentForm.tsx
428
+
429
+ useEffect(() => {
430
+
431
+ let comments: any = [];
432
+
433
+ const unsubscribe: any = db
434
+
435
+ .collection("posts")
436
+
437
+ .doc(id)
438
+
439
+ .collection("comments")
440
+
441
+ .orderBy("createdAt", "desc")
442
+
443
+ .onSnapshot((snapshots) => {
444
+
445
+ snapshots.docChanges().forEach((change) => {
446
+
447
+ const data = change.doc.data({ serverTimestamps: "estimate" });
448
+
449
+ const changeType = change.type;
450
+
451
+
452
+
453
+ switch (changeType) {
454
+
455
+ case "added":
456
+
457
+ comments.push(data);
458
+
459
+ break;
460
+
461
+ case "modified":
462
+
463
+ const index = comments.findIndex(
464
+
465
+ (comment: any) => comment.id === change.doc.id
466
+
467
+ );
468
+
469
+ comments[index] = comment;
470
+
471
+ break;
472
+
473
+ case "removed":
474
+
475
+ comments = comments.filter(
476
+
477
+ (comment: any) => comment.id !== change.doc.id
478
+
479
+ );
480
+
481
+ break;
482
+
483
+ default:
484
+
485
+ break;
486
+
487
+ }
488
+
489
+ });
490
+
491
+ setComment(comments);
492
+
493
+ });
494
+
495
+ return unsubscribe; //変更箇所
496
+
497
+ }, []);
498
+
499
+
500
+
501
+ ```