iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解Angular组件生命周期(一)
  • 788
分享到

详解Angular组件生命周期(一)

2024-04-02 19:04:59 788人浏览 八月长安
摘要

目录概述一、钩子的调用顺序二、onChanges钩子三、变更检测机制和DoCheck()钩子概述 组件声明周期以及angular的变化发现机制 红色方法只执行一次。 变更检测执行的

概述

组件声明周期以及angular的变化发现机制

红色方法只执行一次。

变更检测执行的绿色方法和和组件初始化阶段执行的绿色方法是一个方法。

总共9个方法。

每个钩子都是@angular/core库里定义的接口。


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

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

  constructor() { }

  nGonInit() {
  }

}

虽然接口不是必须的,Angular检测到钩子方法就会去执行它,还是建议把接口写上。

一、钩子的调用顺序


import { Component, OnInit, OnChanges, DoCheck, AfterContentInit, AfterContentChecked, AfterViewInit, AfterViewChecked, OnDestroy, Input, SimpleChange, SimpleChanges } from '@angular/core';

let logIndex: number = 1; //计数器

@Component({
  selector: 'app-life',
  templateUrl: './life.component.html',
  styleUrls: ['./life.component.css']
})
export class LifeComponent implements OnInit, OnChanges, DoCheck, AfterContentInit
  , AfterContentChecked, AfterViewInit, AfterViewChecked, OnDestroy {
  @Input()
  name: string;

  logit(msg: string) {
    console.log(`# ${logIndex++}  ${msg}`);
  }
  constructor() {
    this.logIt("name属性在constructor里的值是: " + this.name);
  }

  ngOnInit() {
    this.logIt("name属性在OnInit里的值是: " + this.name);
  }

  ngOnChanges(changes: SimpleChanges): void { // 传入一个SimpleChanges对象
    let name = changes['name'].currentValue;
    this.logIt("name属性在ngOnChanges里的值是: " + this.name);
  }

  ngDoCheck(): void {
    this.logIt("DoCheck");
  }

  ngAfterContentInit() {
    this.logIt("ngAfterContentInit");
  }

  ngAfterContentChecked() {
    this.logIt("ngAfterContentChecked");
  }

  ngAfterViewInit() {
    this.logIt("ngAfterViewInit");
  }

  ngAfterViewChecked() {
    this.logIt("ngAfterViewChecked");
  }
  ngOnDestroy() {
    this.logIt("ngOnDestory");
  }
}

初始化逻辑依赖输入属性的值时,初始化逻辑一定要写在ngOnInit里,不能写在constructor里面。

DoCheck在Angular的每个变更检测周期中调用。

ngAfterContentInit和ngAfterContentChecked跟模版,组件的内容投影相关的。

ngAfterViewInit和ngAfterViewChecked跟组件的模版,初始化视图相关的。

二、onChanges钩子

父组件初始化或修改子组件的输入参数时会被调用。

需要先理解js中可变对象 和 不可变对象。


//字符串是不可变的
var greeting = "Hello";
greeting = "Hello World";
//对象是可变的
var user = { name: "Tom" };
user.name = "Jerry";

例子:

child组件有3个属性,其中2个是输入属性。

父组件有一个greeting属性和一个name属性是Tom的user对象。

父组件要改变输入属性,所以greeting和user.name是双向绑定。


<div class="parent">
    <h2>我是父组件</h2>
    <div>问候语:<input type="text" [(ngModel)]="greeting"></div>
    <div>
      姓名:
      <input type="text" [(ngModel)]="user.name">
    </div>
    <app-child [greeting]="greeting"  [(user)]="user"> </app-child>
</div>

父组件改变两个input的值,值变化时候传入子组件的值也会变化,传入子组件的输入属性的值变化时会触发ngOnChanges()。

父组件初始化子组件。初始化的时候调一次ngOnChanges(),初始化后子组件的greeting变成Hello,也就是父组件上的greeting的值。

user变成一个name属性为Tom的对象。

改变输入属性的值,父组件问候语greeting改为Helloa。

Angular的变更检测刷新不可变对象,也就是greeting的值,然后调用ngOnChanges()方法,greeting的值从之前的hello,变为了Helloa。

修改user.name为Tomb,控制台上没有打印新的消息。

因为用户只是改变了可变对象user的属性,user对象的引用自身是没有改变的,所以onChanges()方法没有被调用。

虽然可变对象的属性改变不会触发ngOnChanges()方法调用,但是子组件的user对象的属性仍然改变了,由于Angular的变更监测机制仍然捕获了组件中每个对象的属性变化。

改变子组件的message属性也不引起子组件的onChanges()方法调用。因为message不是输入属性。而ngOnChanges()只有在输入属性变化时候被调用。

三、变更检测机制和DoCheck()钩子

变更检测由zone.js实现的。保证组件的属性变化和页面的变化同步。浏览器中发生的异步事件(点击按钮,输入数据,数据从服务器返回,调用了setTimeout()方法)都会触发变更检测。

变更检测运行时,检测组件模版上的所有绑定关系,如果组件属性被改变,与其绑定的模版相应区域可能需要更新。

注意:变更检测机制只是将组件属性的改变反应到模版上,变更检测机制本身永远不会改变组件属性的值。

两种变更检测策略。

  • Default 检测到变化,检查整个组件树。
  • OnPush 只有当输入属性变化时,才去检测该组件及其子组件。

Angular应用是一个以主组件为根的组件树,每个组件都会生成一个变更检测器,任何一个变更检测器检测到变化,zone.js就根据组件的变更检查策略来检测组件(也就是调doCheck()钩子),来判断组件是否需要更新它的模版。

DoCheck检查是从根组件开始往下检查所有的组件树,不管变更发生在哪个组件。

例子:

监控user.name这种可变对象的属性的改变。

在child中加一个oldUsername来存变更前的username,加一个changeDetected属性标志username是否发生变化,默认是false。 noChangeCount计数器默认是0。


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

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

  @Input()
  greeting: string;

  @Input()
  user: { name: string };

  message: string = "初始化消息";
  oldUsername: string;
  changeDetected: boolean = false;
  noChangeCount: number = 0;

  constructor() { }

  ngOnInit() {
  }

  ngOnChanges(changes: SimpleChanges): void {
    console.log(JSON.stringify(changes, null, 2));
  }

  ngDoCheck() {
    if (this.user.name !== this.oldUsername) {
      this.changeDetected = true;
      console.log("DoCheck: user.name 从 " + this.oldUsername + "变为" + this.user.name);
      this.oldUsername = this.user.name;
    }
    if (this.changeDetected) {//变化来计数器清0
      this.noChangeCount = 0;
    } else {//没变化
      this.noChangeCount++;
      console.log("DoCheck:user.name没变化时ngDoCheck方法已经被调用" + this.noChangeCount + "次")
    }
    this.changeDetected = false;//最后不管变没变标志位复位
  }

}

页面加载完成:user.name没变化时DoCheck方法已经被调用1次。

鼠标点击,不改变任何值,点击触发变更检测机制,所有组件的DoCheck就会被调用。

修改Tom为Tomb,DoCheck捕捉到Tom变为Tomb。

虽然DoCheck()钩子可以检测到user.name什么时候发生变化,但是使用必须小心,ngDoCheck()钩子被非常频繁的调用。每次变更检测周期后发生变化的地方都会调用。

对ngDoCheck()的实现必须非常高效,非常轻量级,否则容易引起性能问题。

同理:所有带Check关键字的钩子方法都要非常小心。 ngDoCheck,ngAfterContentChecked,ngAfterViewChecked.

以上就是详解Angular组件生命周期(一)的详细内容,更多关于Angular组件生命周期的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Angular组件生命周期(一)

本文链接: https://www.lsjlt.com/news/126633.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Angular组件生命周期(一)
    目录概述一、钩子的调用顺序二、onChanges钩子三、变更检测机制和DoCheck()钩子概述 组件声明周期以及angular的变化发现机制 红色方法只执行一次。 变更检测执行的...
    99+
    2024-04-02
  • 详解Angular组件之生命周期(二)
    目录一、view钩子1、实现ngAfterViewInit和ngAfterViewChecked钩子时注意事项2、在一个变更检测周期中禁止一个视图被组装好之后再去更新视图二、cont...
    99+
    2024-04-02
  • Angular组件的生命周期有哪些
    这期内容当中小编将会给大家带来有关Angular组件的生命周期有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。概述组件声明周期以及angular的变化发现机制红色方法只执行一次。变更检测执行的绿色方法...
    99+
    2023-06-15
  • React组件的生命周期详解
    目录React生命周期1、初始化阶段2、旧生命周期3、新生命周期4、react中性能优化的方案React生命周期 1、初始化阶段 componentDidMount:render之前...
    99+
    2023-03-19
    React 组件 生命周期 React 生命周期
  • angular组件通讯和组件生命周期是什么
    本文小编为大家详细介绍“angular组件通讯和组件生命周期是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“angular组件通讯和组件生命周期是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深...
    99+
    2024-04-02
  • vue的生命周期钩子与父子组件的生命周期详解
    目录vue的生命周期钩子的介绍父子组件的生命周期加载渲染过程父组件更新过程子组件更新过程父子组件更新过程销毁过程代码示例created和mounted的区别vue的生命周期钩子的介绍...
    99+
    2022-11-13
    vue 生命周期 vue 父子组件生命周期
  • Flutter组件生命周期和App生命周期示例解析
    目录引言无状态组件(StatelessWidget)有状态组件(StatefulWidget)StatefulWidget生命周期详细分析1. createState2. initS...
    99+
    2022-12-08
    Flutter 组件APP生命周期 Flutter 生命周期
  • Vue组件与生命周期详细讲解
    目录写在前面生命周期图解总结写在前面 Vue.js的核心就是以简洁的模板语法将数据渲染进Dom系统。vue实例在渲染成html的时候往往要经过以下的步骤: 读取数据和方法,设置数据绑...
    99+
    2022-11-13
    Vue组件 Vue生命周期
  • Flutter有状态组件StatefulWidget生命周期详解
    目录1、StatefulWidget的背后2、StatefulWidget的生命周期2.1创建阶段2.2更新阶段2.3销毁阶段总结:1、StatefulWidget的背后 flut...
    99+
    2023-01-13
    Flutter StatefulWidget生命周期 Flutter StatefulWidget有状态组件
  • Blazor组件的生命周期解析
    执行周期 1. SetParametersAsync2. OnInitializedAsync(调用两次) 和 OnInitialized;3. OnParametersSetAsy...
    99+
    2024-04-02
  • Angular组件中生命周期钩子的示例分析
    这篇文章主要介绍了Angular组件中生命周期钩子的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Angular 组件生命周期钩子其中,红色标记的生命周期钩子只调用一...
    99+
    2023-06-14
  • Vue生命周期详解
    这篇博客将会从下面四个常见的应用诠释组件的生命周期,以及各个生命周期应该干什么事 单组件的生命周期父子组件的生命周期兄弟组件的生命周期宏mixin的生命周期 生命周期:Vue 实例从...
    99+
    2024-04-02
  • 详解vue生命周期
    目录为什么要理解生命周期什么是生命周期生命周期钩子函数created和mounted钩子的一些实战用法1.异步函数 2.Vue.nextTick对异步函数的结果进行操作 总结为什么要...
    99+
    2024-04-02
  • rust生命周期详解
    目录rust生命周期借用检查函数中的生命周期手动声明生命周期结构体中的生命周期生命周期消除三条消除原则生命周期约束静态生命周期rust生命周期 生命周期是rust中用来规定引用的有效...
    99+
    2023-03-19
    rust生命周期
  • React组件的生命周期详细描述
    目录一、什么是生命周期二、装载过程1、constructor2、render3、componentWillMount和componentDidMount三、更新过程1、compone...
    99+
    2024-04-02
  • vue组件有生命周期吗
    vue组件的生命周期有:1.beforeCreate,创建前;2.created,创建后;3.beforemount,载入前;4.mounted,载入后;5.beforeUpdate,更新前;6.updated,更新后;7.beforeDe...
    99+
    2024-04-02
  • 详解uniapp的生命周期
    Uniapp作为一款跨平台应用开发框架,具有丰富的生命周期,以下是Uniapp的生命周期: 1.应用生命周期 应用生命周期是指应用程序从启动到关闭的整个过程,包括应用程序的启动、前后...
    99+
    2023-05-17
    vue uniapp uniapp生命周期
  • React的生命周期详解
    一、React生命周期 React 生命周期分为三种状态 1. 初始化2.更新3.销毁 初始化 1、getDefaultProps() 设置默认的props,也可以用dufault...
    99+
    2024-04-02
  • vue组件生命周期钩子使用示例详解
    目录组件生命周期图组件生命周期钩子1、beforeCreate2、created3、beforeMount4、mounted5、beforeUpdate6、updated7...
    99+
    2024-04-02
  • Android12四大组件之Activity生命周期变化详解
    目录前言点击返回键Activity不在onDestroy重新onBackPressed时的注意点总结前言 Android12 有很多令人惊喜的变化,比如基于 Material You...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作