首页 web前端 js教程 Angular 中的组件生命周期

Angular 中的组件生命周期

Dec 26, 2024 am 05:02 AM

Angular 生命周期钩子是允许开发人员利用 Angular 组件生命周期的关键时刻的方法,从创建到销毁,包括初始化、更改和销毁。最常用的生命周期钩子是:

  1. 构造函数:页面第一次加载时调用。只打过一次电话。
  2. ngOnChanges:执行多次。第一次将在组件创建/加载时执行。当 @input 装饰器的自定义属性发生更改时,每次都会调用此钩子。与争论一起工作 - 简单的改变
  3. ngOnInit:组件初始化后调用。非常适合设置组件的状态。
  4. ngDoCheck:用于手动检测更改(在每个更改检测周期调用)。
  5. ngAfterContentInit:内容投影到组件后调用。
  6. ngAfterContentChecked:检查投影内容后调用。
  7. ngAfterViewInit:在视图初始化后调用。
  8. ngAfterViewChecked:在 Angular 检查组件视图后调用。
  9. ngOnDestroy:在组件被销毁之前调用。用它来清理资源,比如取消订阅 observables。

Component Lifecycle in Angular

在深入之前,让我们创建先决项目:
我们将需要父组件和子组件。我们将在父组件中有输入字段,并将输入的值传递给子组件,并将显示在子组件中。

parent.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html',
  styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

  value:string = '';
  SubmitValue(val: any) {
    this.value = val.value;
  }

}

parent.component.html

<h1>Lifecycle Hooks</h1>

<input type="text" placeholder="Input here..." #val>
<button (click)="SubmitValue(val)">Submit Value</button>

<br><br>
<app-child [inputValue]="value"></app-child>

child.component.ts

import { Component, Input, OnInit } from '@angular/core';

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {

  constructor() { }

  @Input() inputValue: string = "LifeCycle Hooks";

  ngOnInit(): void {
  }

}

child.component.html

<div>
    Input Value: <strong>{{inputValue}}</strong>
</div>

我们将得到如下输出:

Component Lifecycle in Angular

1.构造函数

  • 构造函数是用于初始化组件的 TypeScript 类方法。它在任何 Angular 生命周期钩子之前调用。
  • 主要用途:初始化依赖注入并设置变量。
export class ChildComponent implements OnInit {

  constructor() {
    **console.log("Constructor Called");**
  }

  @Input() inputValue: string = "LifeCycle Hooks";

  ngOnInit(): void {}

}

Component Lifecycle in Angular

2.ngOnChanges

  • 当组件的任何输入属性更改时调用。
  • 提供一个 SimpleChanges 对象,其中包含输入属性的先前值和当前值。
  • 用法:更新父组件的数据输入属性来触发此钩子。
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html',
  styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

  value:string = '';
  SubmitValue(val: any) {
    this.value = val.value;
  }

}

Component Lifecycle in Angular

我再次输入了值,并再次调用了 ngOnChanges,但构造函数只调用了一次。

Component Lifecycle in Angular

让我们看看更改参数中有什么:

<h1>Lifecycle Hooks</h1>

<input type="text" placeholder="Input here..." #val>
<button (click)="SubmitValue(val)">Submit Value</button>

<br><br>
<app-child [inputValue]="value"></app-child>

Component Lifecycle in Angular

让我们输入一些值来看看:

Component Lifecycle in Angular

3.ngOnInit

  • 在第一个 ngOnChanges 之后调用一次。
  • 主要用途:初始化组件并设置渲染所需的任何数据。
import { Component, Input, OnInit } from '@angular/core';

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {

  constructor() { }

  @Input() inputValue: string = "LifeCycle Hooks";

  ngOnInit(): void {
  }

}

Component Lifecycle in Angular

4.ngDoCheck

  • 每次 Angular 检测到组件或其子组件发生更改时运行。
  • 将其用于自定义更改检测逻辑。
<div>
    Input Value: <strong>{{inputValue}}</strong>
</div>

Component Lifecycle in Angular

5.ngAfterContentInit

  • 内容(例如,)投影到组件后调用一次。

child.component.html

export class ChildComponent implements OnInit {

  constructor() {
    **console.log("Constructor Called");**
  }

  @Input() inputValue: string = "LifeCycle Hooks";

  ngOnInit(): void {}

}

parent.component.html

export class ChildComponent implements OnInit, OnChanges {

  constructor() {
    console.log("Constructor Called");
  }

  ngOnChanges(changes: SimpleChanges): void {
    console.log("ngOnChanges Called");
  }

  @Input() inputValue: string = "LifeCycle Hooks";

  ngOnInit(): void {}

}

child.component.ts

 ngOnChanges(changes: SimpleChanges): void {
    console.log("ngOnChanges Called", changes);
  }

Component Lifecycle in Angular

6.ngAfterContentChecked

  • 每次检查投影内容后调用。
  • 谨慎使用以避免性能问题。
export class ChildComponent implements OnInit, OnChanges {

  constructor() {
    console.log("Constructor Called");
  }
  ngOnChanges(changes: SimpleChanges): void {
    console.log("ngOnChanges Called");
  }

  @Input() inputValue: string = "LifeCycle Hooks";

  ngOnInit(): void {
    console.log("ngOnInit Called");
  }

}

Component Lifecycle in Angular

让我们来玩一下这个:

export class ChildComponent implements OnInit, OnChanges, DoCheck {

  constructor() {
    console.log("Constructor Called");
  }
  ngOnChanges(changes: SimpleChanges): void {
    console.log("ngOnChanges Called", changes);
  }

  @Input() inputValue: string = "LifeCycle Hooks";

  ngOnInit(): void {
    console.log("ngOnInit Called");
  }

  ngDoCheck() {
    console.log("ngDoCheck Called");
  }

}

当 ng-content 再次发生变化时,ngAfterContentChecked 被调用。

Component Lifecycle in Angular

7.ngAfterViewInit

  • 组件视图及其子视图初始化后调用一次。
  • 对于初始化第三方库或 DOM 操作很有用。

Component Lifecycle in Angular

8.ngAfterViewChecked

  • 每次检查组件视图及其子视图后调用。

Component Lifecycle in Angular

9.ngOnDestroy

  • 在组件被销毁之前调用。
  • 将其用于清理任务,例如取消订阅 Observables 或分离事件侦听器。

ngOnDestroy 仅在我们销毁任何组件时才会调用,因此让我们尝试在单击“销毁组件”按钮时删除子组件。
让我们安排一下:

parent.component.ts

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-parent',
  templateUrl: './parent.component.html',
  styleUrls: ['./parent.component.css']
})
export class ParentComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

  value:string = '';
  SubmitValue(val: any) {
    this.value = val.value;
  }

}

parent.component.html

<h1>Lifecycle Hooks</h1>

<input type="text" placeholder="Input here..." #val>
<button (click)="SubmitValue(val)">Submit Value</button>

<br><br>
<app-child [inputValue]="value"></app-child>

在我们单击“销毁组件”按钮之前:

Component Lifecycle in Angular

单击“销毁组件”按钮后:

Component Lifecycle in Angular

生命周期挂钩序列:

  1. 构造函数
  2. ngOnChanges(如果 @Input 属性存在)
  3. ngOnInit
  4. ngDoCheck
  5. ngAfterContentInit
  6. ngAfterContentChecked
  7. ngAfterViewInit
  8. ngAfterViewChecked
  9. ngOnDestroy

通过有效地理解和使用这些钩子,您可以管理组件在其生命周期的不同阶段的行为。

以上是Angular 中的组件生命周期的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

为什么要将标签放在的底部? 为什么要将标签放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

什么是在DOM中冒泡和捕获的事件? 什么是在DOM中冒泡和捕获的事件? Jul 02, 2025 am 01:19 AM

事件捕获和冒泡是DOM中事件传播的两个阶段,捕获是从顶层向下到目标元素,冒泡是从目标元素向上传播到顶层。1.事件捕获通过addEventListener的useCapture参数设为true实现;2.事件冒泡是默认行为,useCapture设为false或省略;3.可使用event.stopPropagation()阻止事件传播;4.冒泡支持事件委托,提高动态内容处理效率;5.捕获可用于提前拦截事件,如日志记录或错误处理。了解这两个阶段有助于精确控制JavaScript响应用户操作的时机和方式。

JavaScript模块上的确定JS综述:ES模块与COMPORJS JavaScript模块上的确定JS综述:ES模块与COMPORJS Jul 02, 2025 am 01:28 AM

ES模块和CommonJS的主要区别在于加载方式和使用场景。1.CommonJS是同步加载,适用于Node.js服务器端环境;2.ES模块是异步加载,适用于浏览器等网络环境;3.语法上,ES模块使用import/export,且必须位于顶层作用域,而CommonJS使用require/module.exports,可在运行时动态调用;4.CommonJS广泛用于旧版Node.js及依赖它的库如Express,ES模块则适用于现代前端框架和Node.jsv14 ;5.虽然可混合使用,但容易引发问题

垃圾收集如何在JavaScript中起作用? 垃圾收集如何在JavaScript中起作用? Jul 04, 2025 am 12:42 AM

JavaScript的垃圾回收机制通过标记-清除算法自动管理内存,以减少内存泄漏风险。引擎从根对象出发遍历并标记活跃对象,未被标记的则被视为垃圾并被清除。例如,当对象不再被引用(如将变量设为null),它将在下一轮回收中被释放。常见的内存泄漏原因包括:①未清除的定时器或事件监听器;②闭包中对外部变量的引用;③全局变量持续持有大量数据。V8引擎通过分代回收、增量标记、并行/并发回收等策略优化回收效率,降低主线程阻塞时间。开发时应避免不必要的全局引用、及时解除对象关联,以提升性能与稳定性。

如何在node.js中提出HTTP请求? 如何在node.js中提出HTTP请求? Jul 13, 2025 am 02:18 AM

在Node.js中发起HTTP请求有三种常用方式:使用内置模块、axios和node-fetch。1.使用内置的http/https模块无需依赖,适合基础场景,但需手动处理数据拼接和错误监听,例如用https.get()获取数据或通过.write()发送POST请求;2.axios是基于Promise的第三方库,语法简洁且功能强大,支持async/await、自动JSON转换、拦截器等,推荐用于简化异步请求操作;3.node-fetch提供类似浏览器fetch的风格,基于Promise且语法简单

var vs Let vs const:快速JS综述解释器 var vs Let vs const:快速JS综述解释器 Jul 02, 2025 am 01:18 AM

var、let和const的区别在于作用域、提升和重复声明。1.var是函数作用域,存在变量提升,允许重复声明;2.let是块级作用域,存在暂时性死区,不允许重复声明;3.const也是块级作用域,必须立即赋值,不可重新赋值,但可修改引用类型的内部值。优先使用const,需改变变量时用let,避免使用var。

JavaScript数据类型:原始与参考 JavaScript数据类型:原始与参考 Jul 13, 2025 am 02:43 AM

JavaScript的数据类型分为原始类型和引用类型。原始类型包括string、number、boolean、null、undefined和symbol,其值不可变且赋值时复制副本,因此互不影响;引用类型如对象、数组和函数存储的是内存地址,指向同一对象的变量会相互影响。判断类型可用typeof和instanceof,但需注意typeofnull的历史问题。理解这两类差异有助于编写更稳定可靠的代码。

如何遍历DOM树(例如,parentnode,children,NextElementsibling)? 如何遍历DOM树(例如,parentnode,children,NextElementsibling)? Jul 02, 2025 am 12:39 AM

DOM遍历是网页元素操作的基础,常用方法包括:1.使用parentNode获取父节点,可链式调用向上查找;2.children返回子元素集合,通过索引访问首个或末尾子元素;3.nextElementSibling获取下一个兄弟元素,结合previousElementSibling实现同级导航。实际应用如动态修改结构、交互效果等,例如点击按钮高亮下一个兄弟节点,掌握这些方法后复杂操作可通过组合实现。

See all articles