Angular组件生命周期详解

这篇具有很好参考价值的文章主要介绍了Angular组件生命周期详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当 Angular 实例化组件类 并渲染组件视图及其子视图时,组件实例的生命周期就开始了。生命周期一直伴随着变更检测,Angular 会检查数据绑定属性何时发生变化,并按需更新视图和组件实例。当 Angular 销毁组件实例并从 DOM 中移除它渲染的模板时,生命周期就结束了。当 Angular 在执行过程中创建、更新和销毁实例时,指令就有了类似的生命周期。

你的应用可以使用生命周期钩子方法来触发组件或指令生命周期中的关键事件,以初始化新实例,需要时启动变更检测,在变更检测过程中响应更新,并在删除实例之前进行清理。

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端

  • 浅灰色名字的事件,在组件的生命周期中只会触发一次,而绿色的随着相应的逻辑变化会多次触发。
Construction, OnChanges, OnInit, DoCheck, AfterContentInit, AfterContentChecked, AfterViewInit, AfterViewChecked, OnDestroy

1 响应生命周期事件

可以通过实现一个或多个 Angular core 库中定义的生命周期钩子接口来响应组件或指令生命周期中的事件。这些钩子让你有机会在适当的时候对组件或指令实例进行操作,比如 Angular 创建、更新或销毁这个实例时。

每个接口都有唯一的一个钩子方法,它们的名字是由接口名再加上 ng 前缀构成的。比如,OnInit 接口的钩子方法叫做 ngOnInit()。如果你在组件或指令类中实现了这个方法,Angular 就会在首次检查完组件或指令的输入属性后,紧接着调用它。

1.1 constructor()

每一个组件文件,本质上都是一个类,而constructor是ES6引入类的概念后新出现的东西,是类的自身属性,所以并非Angular的钩子,constructor的主要作用是注入依赖,这里就不展开了。这是最先被调用的一个函数。Angular 在实例化组件类时执行,可以用来接收 Angular 注入的服务实例对象。

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

// 引入服务
import {StorageService} from '../../services/storage.service'

@Component({
  selector: 'app-life',
  templateUrl: './life.component.html',
  styleUrls: ['./life.component.scss']
})
export class LifeComponent {
  constructor(public StorageService: StorageService) {
    console.log('init StorageService', this.StorageService)
  }
}

1.2 ngOnChanges()

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端

注意这里解释一下什么是输入属性?如下:

Angular的输入属性是指带**有@Input()**装饰器的可设置属性,它允许父组件将数据值发送到子组件中。具体来说,父组件通过绑定属性到子组件,子组件则利用@Input()装饰器来标识这是一个输入变量属性。

一旦检测到该组件或指令的输入属性发生了变化,Angular 就会调用它的 ngOnChanges() 方法。这个 onChanges 范例通过监控 OnChanges() 钩子演示了这一点。

如下例子所示:

父组件:

<app-life [parentValue]="parentValue"></app-life>
<input type="text" name="parentValue" [(ngModel)]="parentValue">

子组件:

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

// 引入服务
import {StorageService} from '../../services/storage.service'

@Component({
  selector: 'app-life',
  templateUrl: './life.component.html',
  styleUrls: ['./life.component.scss']
})
export class LifeComponent {
  constructor(public StorageService: StorageService) {
    console.log('init StorageService', this.StorageService)
  }
  @Input() parentValue: string;
  ngOnChanges(changes: SimpleChanges) {
    console.log(changes)
    for (const propName in changes) {
      const chng = changes[propName];
      const cur  = JSON.stringify(chng.currentValue);
      const prev = JSON.stringify(chng.previousValue);
      console.log('cur = ', cur)
      console.log('prev = ', prev)
    }
  }
}

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端
当输入属性的值发生变化时:
Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端
ngOnChanges() 方法获取了一个对象,它把每个发生变化的属性名都映射到了一个SimpleChange对象,该对象中有属性的当前值和前一个值。这个钩子会在这些发生了变化的属性上进行迭代,并记录它们。

1.3 ngOnInit()

通常我们在这里获取数据或者设置属性值。

ngOnInit() {
  this.getUserDataByAPIRequest();
  this.setOtherData();
  this.age = 18;
}

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端
使用 ngOnInit() 方法执行以下初始化任务:

  • 在构造函数外部执行复杂的初始化。**组件的构造应该既便宜又安全。比如,你不应该在组件构造函数中获取数据。**当在测试中创建组件时或者决定显示它之前,你不应该担心新组件会尝试联系远程服务器。ngOnInit()是组件获取初始数据的好地方。

    你固然可以在构造函数中调用getHeroes(),但那不是最佳实践。让构造函数保持简单,只做最小化的初始化操作,比如把构造函数的参数赋值给属性。构造函数不应该做任何事。它当然不应该调用某个函数来向远端服务(比如真实的数据服务)发起HTTP 请求。而是选择在 ngOnInit 生命周期钩子中调用 getHeroes(),之后 Angular 会在构造出HeroesComponent 的实例之后的某个合适的时机调用 ngOnInit()。

ngOnInit(): void {
  this.getHeroes();
}
  • 在 Angular设置好输入属性之后设置组件。构造函数应该只把初始局部变量设置为简单的值。请记住,只有在构造完成之后才会设置指令的数据绑定输入属性。如果要根据这些属性对指令进行初始化,请在运行ngOnInit() 时设置它们。

    ngOnChanges() 方法是你能访问这些属性的第一次机会。Angular 会在调用 ngOnInit() 之前调用
    ngOnChanges(),而且之后还会调用多次。但它只调用一次 ngOnInit()。

1.4 ngDoCheck()

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端
这种情况不常见,如果是新手也没必要在这上面伤脑筋,只需要知道它会在ngOnInit()和每次ngOnChanges()之后调用。

  ngDoCheck() {
    console.log('ngOnInit()和每次ngOnChanges()之后调用')
  }

1.5 ngAfterContentInit()

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端
它会在 Angular 初始化完该指令的所有内容之后立即调用。要点:

  • 在指令初始化完成之后,它只会调用一次。
  • 可以用来处理一些初始化任务。

1.6 ngAfterContentChecked()

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端
在默认的变更检测器对该指令下的所有内容完成了变更检测之后立即调用。

1.7 ngAfterViewInit()

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端
简单来说就是当组件视图渲染完成后调用,也就是说在这个函数执行之前是没有办法获取到HTML里面的内容的。举个例子,我们想获取视图里的一个div结点, 可以通过ViewChild, 然后尝试在ngOnInit和ngAfterViewInit中去打印。

<app-life [parentValue]="parentValue" #lifeComponent></app-life>
import {Component, ViewChild} from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'firstProject';

  public parentValue: string = 'parentValue'

  @ViewChild('lifeComponent') lifeComponent: any;

  ngOnInit(): void {
    console.log('ngOnInit', this.lifeComponent);
  }

  ngAfterViewInit(): void {
    console.log('ngAfterViewInit', this.lifeComponent);
  }
}

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端

1.8 ngAfterViewChecked()

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端

<app-life [parentValue]="parentValue" #lifeComponent></app-life>
<input type="text" name="parentValue" [(ngModel)]="parentValue">

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = 'firstProject';

  public parentValue: string = 'parentValue'

  @ViewChild('lifeComponent') lifeComponent: any;

  ngOnInit(): void {
    console.log('ngOnInit', this.lifeComponent);
  }

  ngAfterViewInit(): void {
    console.log('ngAfterViewInit', this.lifeComponent);
  }

  ngAfterViewChecked(): void {
    console.log('ngAfterViewChecked', this.lifeComponent);
  }
}

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端

1.9 ngOnDestroy()

Angular组件生命周期详解,FE前端相关知识学习,angular.js,javascript,前端文章来源地址https://www.toymoban.com/news/detail-743352.html

到了这里,关于Angular组件生命周期详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端面试题——详解VUE的生命周期

    前端面试时,很多面试官都会问这样一道题,“学习过vue吗,了解VUE的生命周期吗”,因为vue它是现在前端用的最多的一个框架,想要找前端工作的朋友们还是有必要掌握一下vue的生命周期以及每个周期的作用。下面给大家详解一下vue的生命周期,也欢迎大家对其进行补充!

    2024年02月15日
    浏览(44)
  • Vue--》详解Vue组件生命周期的三个阶段

    目录 组件生命周期 创建阶段 beforeCreate阶段: created阶段: beforeMount阶段

    2024年01月22日
    浏览(73)
  • Angular的生命周期?

    在Angular中,组件具有一系列生命周期钩子函数,它们允许我们在组件不同阶段执行特定的操作。以下是Angular的生命周期钩子函数及其主要用途: 1、ngOnChanges(): 当输入属性(@Input)的值发生变化时调用。可以用来响应输入属性的变化,并执行相关操作。 2、ngOnInit(): 在组件初

    2024年02月11日
    浏览(43)
  • Ionic4 生命周期钩子函数和angular生命周期钩子函数介绍

    Ionic 4(以及之后的 Ionic 版本)使用了 Angular 生命周期钩子,因为 Ionic 是基于 Angular 构建的。因此,Ionic 4 中的生命周期与 Angular 组件生命周期非常相似。以下是一些常见的 Ionic 4 生命周期钩子: ionViewDidLoad : 在页面加载完成后触发。通常用于执行一次性的初始化任务。不推

    2024年02月07日
    浏览(54)
  • Angular 学习日记 - 7 - 生命周期

     建议在实现Angular  生命周期(LifeCycle Hooks) 时,可以写在类实现的后面,既可以方便他人知晓用了哪些生命周期方法,又可以用vscode自动补全来生成该方法,还可以防止拼错方法名 (指我自己) 。 1、ngOnInit() 在构造函数触发后触发   2、ngOnChanges() 触发时会自动传入一个

    2024年02月04日
    浏览(50)
  • [Angular 基础] - 生命周期函数

    之前的笔记: [Angular 基础] - Angular 渲染过程 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面,即不涉及到跨组件交流的内容 以下涉及到组件内的沟通,从这开始数据就“活”了 [Angular 基础] - 自定义事件 自定义属性 [Angular 基础]

    2024年02月20日
    浏览(41)
  • Angular系列教程之生命周期钩子

    Angular是一种流行的前端开发框架,它提供了许多功能强大且易于使用的工具和特性。其中之一就是生命周期钩子(Lifecycle Hooks),它们允许我们在组件的不同生命周期阶段执行自定义代码。本文将介绍Angular的生命周期钩子以及如何使用它们。 生命周期钩子是一些用于在组件

    2024年01月17日
    浏览(44)
  • Android Jetpack中Lifecycle使用生命周期感知型组件处理生命周期

    在使用Kotlin实现Android Jetpack中Lifecycle使用生命周期感知型组件处理生命周期的功能时,你需要以下步骤: 首先,在app的build.gradle文件中添加Lifecycle相关库的依赖项: 然后,在你的Activity或Fragment中创建一个LifecycleObserver对象,并使用@OnLifecycleEvent注解来实现相应的生命周期方法

    2024年01月21日
    浏览(49)
  • 【React】组件生命周期、组件通信、setState

    ◼ 组件化思想的应用: ​  有了组件化的思想,我们在之后的开发中就要充分的利用它。 ​  尽可能的将页面拆分成一个个小的、可复用的组件。 ​  这样让我们的代码更加方便组织和管理,并且扩展性也更强。 ◼ React的组件相对于Vue更加的灵活和多样,按照不同的

    2024年01月20日
    浏览(43)
  • 小程序组件的生命周期

    组件的生命周期,指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。 其中,最重要的生命周期是 created attached detached ,包含一个组件实例生命流程的最主要时间点。          ·组件实例刚刚被创建好时, created 生命周期被触发

    2023年04月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包