Angular 中的组件生命周期
Angular 生命周期钩子是允许开发人员利用 Angular 组件生命周期的关键时刻的方法,从创建到销毁,包括初始化、更改和销毁。最常用的生命周期钩子是:
- 构造函数:页面第一次加载时调用。只打过一次电话。
- ngOnChanges:执行多次。第一次将在组件创建/加载时执行。当 @input 装饰器的自定义属性发生更改时,每次都会调用此钩子。与争论一起工作 - 简单的改变
- ngOnInit:组件初始化后调用。非常适合设置组件的状态。
- ngDoCheck:用于手动检测更改(在每个更改检测周期调用)。
- ngAfterContentInit:内容投影到组件后调用。
- ngAfterContentChecked:检查投影内容后调用。
- ngAfterViewInit:在视图初始化后调用。
- ngAfterViewChecked:在 Angular 检查组件视图后调用。
- ngOnDestroy:在组件被销毁之前调用。用它来清理资源,比如取消订阅 observables。
在深入之前,让我们创建先决项目:
我们将需要父组件和子组件。我们将在父组件中有输入字段,并将输入的值传递给子组件,并将显示在子组件中。
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>
我们将得到如下输出:
1.构造函数
- 构造函数是用于初始化组件的 TypeScript 类方法。它在任何 Angular 生命周期钩子之前调用。
- 主要用途:初始化依赖注入并设置变量。
export class ChildComponent implements OnInit { constructor() { **console.log("Constructor Called");** } @Input() inputValue: string = "LifeCycle Hooks"; ngOnInit(): void {} }
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; } }
我再次输入了值,并再次调用了 ngOnChanges,但构造函数只调用了一次。
让我们看看更改参数中有什么:
<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>
让我们输入一些值来看看:
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 { } }
4.ngDoCheck
- 每次 Angular 检测到组件或其子组件发生更改时运行。
- 将其用于自定义更改检测逻辑。
<div> Input Value: <strong>{{inputValue}}</strong> </div>
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); }
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"); } }
让我们来玩一下这个:
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 被调用。
7.ngAfterViewInit
- 组件视图及其子视图初始化后调用一次。
- 对于初始化第三方库或 DOM 操作很有用。
8.ngAfterViewChecked
- 每次检查组件视图及其子视图后调用。
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>
在我们单击“销毁组件”按钮之前:
单击“销毁组件”按钮后:
生命周期挂钩序列:
- 构造函数
- ngOnChanges(如果 @Input 属性存在)
- ngOnInit
- ngDoCheck
- ngAfterContentInit
- ngAfterContentChecked
- ngAfterViewInit
- ngAfterViewChecked
- ngOnDestroy
通过有效地理解和使用这些钩子,您可以管理组件在其生命周期的不同阶段的行为。
以上是Angular 中的组件生命周期的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

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

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

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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

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

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

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