重新加载+导航到另一个页面后组件未销毁

Posted

技术标签:

【中文标题】重新加载+导航到另一个页面后组件未销毁【英文标题】:Component not destroyed after Reload + Navigating to another page 【发布时间】:2020-05-16 16:00:19 【问题描述】:

在 Ionic v4 应用程序中,当我刷新页面然后通过调用 Router.navigateByUrl() 导航回另一个页面时,不会调用 ngOnDestroy

基于this answer,我尝试通过在ngOnDestroy 上应用@HostListener("window:beforeunload") 来破坏重新加载的页面,但我面临的问题与我需要的方式不同,即页面需要刷新后销毁,然后导航到另一个页面。

This demo 显示了我的问题,这些是重现它的步骤:

    访问应用程序:应用程序自动加载到父页面,这是演示中的第一个也是唯一的选项卡 通过单击“导航到子”按钮导航到子页面:然后打开子页面 通过进入应用内浏览器中的栏地址,在其中单击,然后按回车键重新加载子页面(不要使用重新加载按钮,因为它会重新加载应用程序并直接指向父页面) 点击“导航回父页面”按钮导航回父页面

在最后一步中,控制台没有记录子页面被破坏,当从父页面再次访问时,它也没有记录它被初始化。这意味着子页面没有被破坏。

请注意,在子页面没有刷新的情况下,点击“Navigate Back to Parent”按钮,子组件会被销毁(调用ngOnDestroy),然后在下次访问时创建/初始化.

【问题讨论】:

【参考方案1】:

每当组件在路由器刷新后初始化时,我发现一件奇怪的事情,该组件并没有在 Ionic 中销毁。

我尝试了以下方式。刷新子组件后。

    在父组件中实现 OnInit 和 OnDestroy。 然后点击进入子组件,然后点击“导航到父组件” 之后我点击了导航到子组件。此处它在该控制台中显示“已初始化父组件和已销毁父组件”。`
export class Tab1Component implements OnInit, OnDestroy 

    constructor(private router: Router) 

    navigatToChild() 
      this.router.navigateByUrl("/tabs/tab1/child")
    

    ngOnInit() 
      console.log("Parent component initialized")
    

    @HostListener("window:beforeunload")
    ngOnDestroy() 
      console.log("Parent component destroyed")
    

【讨论】:

我像你一样添加了日志,我也注意到了这种行为。就像导航颠倒了一样:子组件保持原位,而父组件在每次导航时都被初始化和销毁​​

以上是关于重新加载+导航到另一个页面后组件未销毁的主要内容,如果未能解决你的问题,请参考以下文章

重新加载页面后重新使用 UCWA 应用程序

Blazor 服务器端 SPA:重新加载组件后的组件状态

在同一导航单击上重新加载路由器组件 - 在导航单击上刷新页面

导航时如何防止div重新加载

Vue JS 组件重新附加或缓存

Angular 2组件未导航到另一个组件