使用 navCtrl.navigateRoot() 导航到 Ionic 4 中的页面时,是否总是调用 ngOnInit()?

Is ngOnInit() always called when navigating to a Page in Ionic 4 using navCtrl.navigateRoot()?

我找不到关于新 Ionic NavController 的官方 Ionic 4 文档,我想知道我们是否可以假设 ngOnInit()总是 在 Ionic 上被调用如果我们使用 navCtrl.navigateRoot() 触发导航,我们将导航到页面组件,即使该页面的实例已经存在(如果我们已经访问过该页面,则可能是这种情况)。

在我看来,至少在使用 navCtrl.navigateRoot() 时,总是会在我们导航到的页面组件上调用 ngOnInit() 方法。不过,我不确定在哪里可以找到有关此行为的确认信息。

如果不是这种情况,推荐的方法是什么来确保每次用户导航到页面时执行页面组件的方法?

谢谢!

Ionic 3 的导航系统基于导航控制器,而如您所知,Ionic 4 提倡Angular自然的导航方式 - 路由器。

在 Ionic 3 中,ngOnInit() 会为进入导航堆栈的 component/page 触发一次。

因此,如果我们有一个导航堆栈并且 navCtrl.navigateRoot()(或者在 ionic 3 中它是 navCtrl.setRoot())被调用 那将 replace/remove 旧实例并将引入新实例,生命周期挂钩将被调用

在 Ionic 4 中,导航控制器的设计预计会支持相同的行为,但它不支持延迟加载的组件。所以你每次调用 nav.setRoot 等效项时看到 ngOnInit 触发的原因 - 是因为你替换了堆栈中的组件(有效地销毁它)并在其位置引入了一个新组件。

在某些情况下它不会被调用(比如如果你开始使用 push / pop 并且你将以不同的方式管理堆栈([page1,page2])不会破坏你的 page/components - 那么 ngOnInit 将不会被调用。

对于每次组件进入视图时调用的生命周期挂钩 - 正如您所记得的那样,它曾经是 ionViewDidEnter。你能检查一下这个在 ionic 4 中是否仍然有效吗?文档并没有说它不受支持,反之亦然也没有确认它。

TBH 当我切换到 Ionic 4 时,我会考虑利用基于路由器的导航,因为 Nav Controller 现在在 Ionic 4 中更像是一个向后兼容功能。