From 690604a31bf025229c1d7c47da0ca7128ff75312 Mon Sep 17 00:00:00 2001 From: the1812 Date: Fri, 10 May 2024 20:06:50 +0800 Subject: [PATCH] Add comment area removed callbacks --- src/components/utils/comment/areas/base.ts | 7 +++++++ .../utils/comment/comment-area-manager.ts | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/components/utils/comment/areas/base.ts b/src/components/utils/comment/areas/base.ts index d733495cb..1535690d1 100644 --- a/src/components/utils/comment/areas/base.ts +++ b/src/components/utils/comment/areas/base.ts @@ -97,6 +97,13 @@ export abstract class CommentArea { performance.measure('observeItems', 'observeItems start', 'observeItems end') } + destroy() { + this.observer?.disconnect() + this.items.forEach(item => { + this.itemCallbacks.forEach(pair => pair.removed?.(item)) + }) + } + static resolveCallbackPair void>( input: CommentCallbackInput, ): CommentCallbackPair { diff --git a/src/components/utils/comment/comment-area-manager.ts b/src/components/utils/comment/comment-area-manager.ts index 3d0d4e5ff..0873659fc 100644 --- a/src/components/utils/comment/comment-area-manager.ts +++ b/src/components/utils/comment/comment-area-manager.ts @@ -1,4 +1,4 @@ -import { allMutations } from '@/core/observer' +import { allMutations, childList } from '@/core/observer' import { getCommentArea } from './comment-area' import { CommentAreaCallback, @@ -7,6 +7,7 @@ import { CommentItemCallback, } from './types' import { CommentArea } from './areas/base' +import { deleteValue } from '@/core/utils' export class CommentAreaManager { /** 当前页面所有的评论区列表 */ @@ -35,6 +36,18 @@ export class CommentAreaManager { this.commentAreas.push(area) area.observeItems() this.commentAreaCallbacks.forEach(c => c.added?.(area)) + const [observer] = childList(area.element.parentElement, records => { + records.forEach(r => { + r.removedNodes.forEach(removedNode => { + if (removedNode === area.element) { + deleteValue(this.commentAreas, a => a === area) + this.commentAreaCallbacks.forEach(c => c.removed?.(area)) + area.destroy() + observer.disconnect() + } + }) + }) + }) } }