【问题标题】:Ionic 3 Component vs PageIonic 3 组件与页面
【发布时间】:2017-12-29 22:58:02
【问题描述】:

您能告诉我Ionic 3 应用程序中的ComponentPage 生成器有什么区别吗?看来我也可以在组件内部使用像ionViewWillLeave 这样的页面生命周期钩子。那么我什么时候应该使用角度生命周期钩子呢?如果相同,那么为什么它有 2 个发电机?希望您对此提供反馈。

组件生成器:

 ionic generate component SubscribeTopicComponent

页面生成器:

ionic generate page LoginPage

【问题讨论】:

  • 从 Angular 的角度来看可能是一样的,但是在 Ionic 中 PagesComponents 有不同的含义。 两者都只是组件,但 Page 是一个组件,它将充当整个视图(它可能具有嵌套组件);我们将 Ionic 页面视为一个独立的概念。 component 在 Angular 应用程序中大部分时间只是更大组件的一部分,所以我想这是与 Pages 最大的区别。
  • 关于使用 Angular 的生命周期钩子时,我喜欢在组件中使用它们,但在处理页面时我更喜欢 Ionic 生命周期钩子。主要是因为ionViewWillEnter 在一个简单的组件内部没有太大意义,而ngOnInit 则可以。我还在页面上使用了一些 Angular 生命周期钩子,例如 ngOnDestroy(当页面被销毁时,我使用它从页面中删除所有订阅)。我不确定这是否是使用它们的最佳方式,但我想这是有道理的......
  • 是的,ionViewWillLeave() 清除订阅事件呢?这不好吗? @sebaferreras
  • 这是不对的,因为那个钩子意味着用户正在离开页面,但并不是说页面会被破坏,从而留下一些内存泄漏 .由于 Ionic 缓存页面,如果您使用 ionViewWillLeave 您可以清理订阅,并且下次用户访问该页面时(如果它已被缓存,因此不会再次创建)与这些订阅相关的代码不会被执行。
  • 非常感谢 :) 就像你说的 ionViewWillUnload 似乎是进行清理的正确位置(出于某种原因,我不知道那个钩子)。而且你对缓存场景是正确的,如果你使用离子挂钩来创建订阅,你也可以使用离子挂钩来清理它。这完全取决于您想在什么特定时间(钩子)做某事。

标签: angular typescript ionic-framework ionic2 ionic3


【解决方案1】:

根据来自 cmets 的对话:

从 Angular 的角度来看可能是一样的,但是 Pages 和 Components 在 Ionic 中有不同的含义。 在 Angular 方面,两者都只是组件,但在 Ionic 的上下文中,页面是一个组件,将充当整个视图 (它可能有嵌套组件);我们将 Ionic 页面视为一个独立的概念。在 Angular 应用程序中,大部分时间组件只是更大组件的一部分,所以我想这是与 Pages 最大的区别。

关于使用 Angular 的生命周期钩子时,我喜欢在嵌套组件中使用它们,但在处理页面时我更喜欢 Ionic 生命周期钩子。主要是因为像ionViewWillEnter 这样的东西在ngOnInit 的简单组件的上下文中没有太大意义。话虽如此,我还在 Pages 上使用了一些 Angular 生命周期钩子,例如 ngOnDestroy(当该页面将被销毁时,我用它来删除页面中的所有订阅),但就像你说的那样,ionViewWillUnload如果我们想使用 Ionic 的生命周期钩子,这似乎是正确的方法。

我猜大多数 Ionic 生命周期钩子与用户与整个页面交互的方式更相关(将进入页面,将离开从一个页面,可以进入一个页面,可以从一个页面离开......)Angular生命周期钩子更多地与单个组件生命的不同阶段相关(输入已经初始化,更改检测器已检查此组件中是否有更改,...),如您所见,这可能与用户交互根本没有直接关系,而且通常是用户不知道的事情。

我很确定没有关于哪种方法更好的规则,但最重要的是一致性。 我认为在 Pages 组件中使用 Ionic 生命周期钩子并在嵌套组件中使用 Angular 生命周期钩子是有意义的,但您可以使用不同的方法,只要您始终如一地使用整个应用程序。

【讨论】:

  • 非常感谢您的精彩解释 :)
  • 这个答案对 Ionic 4 是否同样有效?
  • @NigelPeck 不完全...请查看this link 以获得有关 Ionic 4 中生命周期挂钩的良好解释 :)
【解决方案2】:

有两个单独的生成器,因为添加了一个额外的装饰器到 ionic:@IonicPage

这个装饰器比简单的组件有一些优点。

  1. 路由 - 您可以表示页面的 url 是什么,如何到达那里以及它的默认历史记录是什么。有了这个,您可以直接访问任何页面,而无需通过导航路径。到这个页面的路由也可以用字符串而不是实际的组件来完成

  2. 延迟加载 - 默认情况下,具有此装饰器的页面模块在转到页面的 url 时会延迟加载。

  3. 不依赖应用程序模块 - 这更像是个人最喜欢的,但是当您创建页面模块时,您不必将它们添加到原始 ngModule 中,这是在编译时自动完成的。

更多文档: https://ionicframework.com/docs/api/navigation/IonicPage/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 2018-06-17
    • 2018-05-25
    • 2018-02-27
    • 2019-04-30
    • 2018-03-19
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多