【问题标题】:Angular life-cycle hooksAngular 生命周期钩子
【发布时间】:2017-11-22 16:52:24
【问题描述】:

我画了一个代表组件生命周期流程的草图

使用sketch.io

在完成the docs关于生命周期钩子之后
我想出了这个草图。 现在这是组件中生命周期钩子的正确顺序吗?

【问题讨论】:

  • 文档有什么不清楚的地方吗?
  • 不,先生,文档很棒,但我只需要验证我对生命周期挂钩的理解。

标签: angular lifecycle


【解决方案1】:

这是我从Angular.io 文档中了解到的。它可以帮助你。

【讨论】:

    【解决方案2】:

    您提供的草图有些正确。供您参考,我尝试实现每个钩子。为了以防万一确定它们的发生点,我将它们中的每一个都记录到了控制台。

    供您参考,下面是我的控制台的屏幕截图,因为我允许我的应用程序一个接一个地加载并遵循每个生命周期。

    这是第一次加载页面时的控制台。

    因此,在此生命周期中调用的组件具有自己的功能:

    1)构造函数:类实例化时调用的默认方法。

    2)ngOnChanges:在创建新组件时执行,当与 @Input 绑定的属性之一发生更改时,它也是唯一在调用时接受参数的钩子作为 SimpleChanges。

    3)ngOnInit:在组件初始化后调用。这不允许组件在 DOM 上可见。这在构造函数之后运行。

    4)ngDoCheck:在变更检测运行时运行。如果没有变化,它也会运行,即使它只是一个发生的事件,以防万一,以确保是否有一些变化。 (例如:它会在按钮单击事件之后运行,而不管它是否正在改变蚂蚁) 5)ngAfterContentInit:在内容(ng-content)被投影到视图后调用。

    6)ngAfterContentChecked:在检查每个投影内容后调用。

    7)ngAfterViewInit:在组件视图(和子视图)初始化后调用。

    8)ngAfterViewChecked:每次检查视图(和子视图)时调用。

    在下图中,当我单击左上角的链接“食谱书”导航栏标题时查找控制台:

    我们可以清楚地看到“ngDoCheck”被调用,然后是“ngAfterContentChecked”,最后是“ngViewChecked”。如果您注意到 'ngAfterContentInit' 和 'ngViewInit' 仅在内容最终投影到视图时才在开始时调用。它们与发生的相应变化无关。

    9)ngOnDestroy:当我们通常使用 if 条件并相应地渲染组件时调用。这主要是在对象被角度破坏之前调用的。

    请参阅下图并查找当我单击“销毁第一个组件”按钮时消失的配方信息卡:

    这里 'ngOnDestroy' 被调用,然后是 'ngDoCheck' 和其他后续钩子。这将使循环再次被调用,但被破坏的内容不会被渲染。 (仅供参考,这里我刚刚使用了一种拼接方法来破坏其中一个呈现的内容)

    如果需要,我也可以提供代码,希望这可以帮助您和其他人了解 Angular 中生命周期钩子的功能。 :)

    附:请忽略该页面截图上的其余元素。

    【讨论】:

    • 不是来自马克西米利安·施瓦茨米勒配方项目吗:D
    • 没错!食谱项目。 :D
    • 这个例子没有说明重点,就是为什么要调用它,为什么???为什么它有用,何时使用它??
    • 您好@ieXcept,您在哪里看到 Raed Khalaf 先生询问为什么以及何时需要调用生命周期挂钩?他的意图是验证他提供的草图是否正确。这就是我在回答中所说的所有理解和截图。提出您的问题,即何时应该调用这些完全取决于“您的”用例。我建议你对这些钩子有一个完全的了解。这可能会帮助您自己回答问题。谢谢! :)
    【解决方案3】:

    ngOnChanges() 不是在 constructor 之后调用的,而是在更改检测运行并且更改检测更新为 @Input() 之后调用。
    运行更改检测时还会调用 ngDoCheck()
    在第一次调用 ngOnChanges() 之后调用ngOnInit()

    另见https://angular.io/guide/lifecycle-hooks

    【讨论】:

    • ngOnChanges() 会在“@Input”发生变化时调用,在构造函数执行后,Angular 会设置“@Input”数据,即触发 ngOnChanges()。
    • 我认为这是误导。 Angular 在创建组件后对组件运行更改检测。如果有输入绑定,它们将被更新,因此ngOnChanges() 将被调用。 ngOnChanges() 与构造函数无关。
    • 其实和构造函数没有关系,但是执行的顺序是构造函数,onChanges,然后是OnInit
    • 如果您只对纯粹的及时订单感兴趣,那么可以,但我认为这样记忆它不是一个好主意。我更多的是为了理解而不仅仅是记忆。不过,每个人都有自己的方式,因此只是我的看法。
    • 如果组件中没有@Input()s,则不应调用ngOnChanges()(虽然尚未验证我自己)。
    猜你喜欢
    • 2018-08-30
    • 2018-01-11
    • 2019-06-26
    • 2018-05-28
    • 2017-01-18
    • 2017-11-13
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多