【angular教程240110】07 Angular中的生命周期函数--动态挂载销毁组件

【angular教程240110】07 Angular中的生命周期函数–动态挂载销毁组件

目录

  • 组件的生命周期
  • 1 前提条件
  • 2 生命周期的顺序
  • 3 Angular组件的生命周期函数:
    • ngOnChanges()
      • 用途
    • ngOnInit()
      • 用途
    • ngDoCheck()
      • 用途
    • ngAfterContentInit()
      • 用途
    • ngAfterContentChecked()
      • 用途
    • ngAfterViewInit()
      • 用途
    • ngAfterViewChecked()
      • 用途
    • ngOnDestroy()
      • 用途
  • 4 一个生命周期演示代码示例
    • 1 子组件
    • 2 在根组件上运行

一、constructor  (非生命周期函数)
二、ngOnChanges()
三、ngOnInit()
四、ngDoCheck()
五、ngAfterContentInit()
六、ngAfterContentChecked()
七、ngAfterViewInit()
八、ngAfterViewChecked()
九、ngOnDestroy()
生命周期钩子用途时机
ngOnChanges()当Angular设置或重新设置数据绑定的输入属性时响应。该方法接受当前和上一属性值的SimpleChanges对象。注意:这发生得比较频繁,所以在这里执行的任何操作都会显著影响性能。如果组件绑定过输入属性,那么在ngOnInit()之前以及所绑定的一个或多个输入属性的值发生变化时都会调用。注意:如果组件没有输入属性,或者你使用它时没有提供任何输入属性,那么框架就不会调用ngOnChanges()。
ngOnInit()在Angular第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。在第一轮ngOnChanges()完成之后调用,只调用一次。而且即使没有调用过ngOnChanges(),也仍然会调用ngOnInit()(比如当模板中没有绑定任何输入属性时)。
ngDoCheck()检测,并在发生Angular无法或不愿意自己检测的变化时作出反应。紧跟在每次执行变更检测时的ngOnChanges()和首次执行变更检测时的ngOnInit()后调用。
ngAfterContentInit()当Angular把外部内容投影进组件视图或指令所在的视图之后调用。第一次ngDoCheck()之后调用,只调用一次。
ngAfterContentChecked()每当Angular检查完被投影到组件或指令中的内容之后调用。ngAfterContentInit()和每次ngDoCheck()之后调用。
ngAfterViewInit()当Angular初始化完组件视图及其子视图或包含该指令的视图之后调用。第一次ngAfterContentChecked()之后调用,只调用一次。
ngAfterViewChecked()每当Angular做完组件视图和子视图或包含该指令的视图的变更检测之后调用。ngAfterViewInit()和每次ngAfterContentChecked()之后调用。
ngOnDestroy()每当Angular每次销毁指令/组件之前调用并清扫。在这儿反订阅可观察对象和分离事件处理器,以防内存泄漏。在Angular销毁指令或组件之前立即调用。

组件的生命周期

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

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

1 前提条件

在使用生命周期钩子之前,应该对这些内容有一个基本的了解:

TypeScript 编程
Angular 应用设计基础,就像 Angular 的基本概念中所讲的那样
响应生命周期事件
可以通过实现一个或多个 Angular core 库中定义的生命周期钩子接口来响应组件或指令生命周期中的事件。这些钩子让有机会在适当的时候对组件或指令实例进行操作,比如 Angular 创建、更新或销毁这个实例时。

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

peek-a-boo.directive.ts (excerpt)
content_copy
@Directive({selector: '[appPeekABoo]'})export class PeekABooDirective implements OnInit {constructor(private logger: LoggerService) { }// implement OnInit's `ngOnInit` methodngOnInit() {this.logIt('OnInit');}logIt(msg: string) {this.logger.log(`#${nextId++} ${msg}`);}
}

不必实现所有生命周期钩子,只要实现需要的那些就可以了。

2 生命周期的顺序

当的应用通过调用构造函数来实例化一个组件或指令时,Angular 就会调用那个在该实例生命周期的适当位置实现了的那些钩子方法。

Angular 会按以下顺序执行钩子方法。可以用它来执行以下类型的操作。
生命周期范例

3 Angular组件的生命周期函数:

ngOnChanges()

在Angular设置数据绑定输入属性后调用,或者设置的输入属性的值发生变化时调用。

用途

用于响应Angular数据绑定输入属性的变化。

ngOnInit()

在Angular第一次显示数据绑定属性之后调用,初始化逻辑放在这里。

用途

初始化组件数据。

ngDoCheck()

在Angular变更检测机制无法或放弃自身检测的情况下使用。

用途

检查自定义变更检测。

ngAfterContentInit()

当Angular把外部内容投影到组件视图后调用。

用途

外部内容初始化后的逻辑。

ngAfterContentChecked()

在Angular每次检查完被投影到组件的内容之后调用。

用途

外部内容每次检查后的逻辑。

ngAfterViewInit()

组件视图及子视图初始化完毕时调用。

用途

初始化视图及子视图。

ngAfterViewChecked()

在Angular每次检查完组件视图及其子视图之后调用。

用途

视图及子视图每次检查后的逻辑。

ngOnDestroy()

在Angular销毁组件前调用,清理工作在这里进行。

用途

组件销毁前的清理工作。

4 一个生命周期演示代码示例

1 子组件

<p>lifecycle works!</p>
<h2>{{msg}}</h2>
<br>
<button (click)="changeMsg()">改变msg的值</button>
<input type="text" [(ngModel)]="userinfo" />
import { Component, OnInit, Input } from '@angular/core';
@Component({selector: 'app-lifecycle',templateUrl: './lifecycle.component.html',styleUrls: ['./lifecycle.component.scss'],
})
export class LifecycleComponent implements OnInit {@Input('title')title!: string;public msg: string = '我是一个生命周期演示';public userinfo: string = '';public oldUserinfo: string = '';constructor() {console.log('00构造函数执行了---除了使用简单的值对局部变量进行初始化之外,什么都不应该做');}ngOnChanges() {console.log('01ngOnChages执行了---当被绑定的输入属性的值发生变化时调用(父子组件传值的时候会触发)');}ngOnInit() {console.log('02ngOnInit执行了--- 请求数据一般放在这个里面');}ngDoCheck() {//写一些自定义的操作console.log('03ngDoCheck执行了---检测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应');if (this.userinfo !== this.oldUserinfo) {console.log(`你从${this.oldUserinfo}改成${this.userinfo}`);this.oldUserinfo = this.userinfo;} else {console.log('数据没有变化');}}ngAfterContentInit() {console.log('04ngAfterContentInit执行了---当把内容投影进组件之后调用');}ngAfterContentChecked() {console.log('05ngAfterContentChecked执行了---每次完成被投影组件内容的变更检测之后调用');}ngAfterViewInit(): void {console.log('06 ngAfterViewInit执行了----初始化完组件视图及其子视图之后调用(dom操作放在这个里面)');}ngAfterViewChecked() {console.log('07ngAfterViewChecked执行了----每次做完组件视图和子视图的变更检测之后调用');}ngOnDestroy() {console.log('08ngOnDestroy执行了····');}//自定义方法changeMsg() {this.msg = '数据改变了';}
}

2 在根组件上运行

<h3>我是主组件</h3>
<hr>
<app-lifecycle [title]="title" *ngIf="flag"></app-lifecycle>
<br>
<button (click)="changeTitel()"> 改变父组件的title </button>
<br>
<button (click)="changeFlag()"> 挂载以及卸载组件 </button>
import { Component } from '@angular/core';
@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.scss']
})
export class AppComponent {title = '24stu';public flag: boolean = true;changeTitel() {this.title = '改变后的title';}changeFlag() {this.flag = !this.flag;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端浏览器滚动条炫酷美化

一、文章引导 #mermaid-svg-2qRndEP8CFzlUhap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2qRndEP8CFzlUhap .error-icon{fill:#552222;}#mermaid-svg-2qRndEP8CFzlUhap .error-text{fill:#552222;stroke:#55222…

华为OD机试真题-最长的指定瑕疵度的元音子串-2023年OD统一考试(C卷)

题目描述: 开头和结尾都是元音字母(aeiouAEIOU)的字符串为 元音字符串 ,其中混杂的非元音字母数量为其 瑕疵度 。比如: “a” 、 “aa”是元音字符串,其瑕疵度都为0 “aiur”不是元音字符串(结尾不是元音字符) “abira”是元音字符串,其瑕疵…

多模态+SNN个人学习历程和心得

祖传开头 这次想写一个一直深藏心中的研究方向&#xff0c;那就是多模态方向。其实当初在实验室那会儿&#xff0c;最先接触的就是多模态的工作&#xff0c;因此这是我科研之路的起点。只不过&#xff0c;后来经历了一些波折&#xff0c;导致个人没有往这个方向深挖&#xff0…

PayPal账号被关联!跨境卖家如何自救?关于PayPal防关联你不得不知道的事!

很多跨境卖家的支付平台都会选择 PayPal&#xff0c;但是 PayPal 账号在使用过程中也经常会遇见关联&#xff0c;风控等问题&#xff0c;这时候为了保护我们的 PayPal 账号安全&#xff0c;防关联就很重要。今天龙哥就分享一些关于 PayPal 防关联的内容&#xff0c;希望能够帮助…

重新认识canvas,掌握必要的联结密码

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

C++ continue语句

作用&#xff1a;在循环语句中&#xff0c;跳过本次循环中余下尚未执行的语句&#xff0c;继续执行下一次循环 与break的区别在于&#xff0c;如果把上述continue换位break&#xff0c;则该程序执行到break则会直接退出for循环&#xff0c;不再执行后面的代码和以后的循环。 实…

加载和保存模型参数

前言 深度学习框架提供了内置函数来保存和加载整个网络。需要注意的是&#xff0c;这将保存模型的参数而不是整个模型。 加载和保存 class MLP(nn.Module):def __init__(self):super().__init__()self.hiddennn.Linear(20,256)self.outputnn.Linear(256,10)def forward(self…

Web实战丨基于django+html+css+js的电子商务网站

文章目录 写在前面实验目标需求分析实验内容安装依赖库1.登陆界面2.注册界面3.电子商城界面4.其他界面 运行结果写在后面 写在前面 本期内容&#xff1a;基于DjangoHTMLCSSJS的电子商务网站 实验环境&#xff1a; vscode或pycharmpython(3.11.4)django 代码下载地址&#x…

【Kafka-3.x-教程】-【七】Kafka 生产调优、Kafka 压力测试

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

Android - 串口通讯(SerialPort)

最早的博客Android 模拟串口通信过程_launch virtual serial port driver pro-CSDN博客里就是用过 Google 提供的 demo&#xff0c;最近想再写个其他的demo发现用起来有点麻烦&#xff0c;还需要导入其他 module&#xff0c;因此在网上找到了Android-SerialPort-API: https://g…

数据分析---SQL(1)

目录 什么是数据倾斜问题SQL如何解决数据倾斜问题having和where的区别在union和join的区别举例说明使用union使用joincount(*)、count(字段)和count(distinct字段)的区别什么是数据倾斜问题 数据倾斜问题是指在数据分布不均匀的情况下,某些特定的数据分区或键值会出现过…

SpringBoot整合FreeMarker模板引擎

中文官方参考手册 http://freemarker.foofun.cn/ 1.先加入FreeMarker依赖 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version> </dependency>2.新建一个FreeMark…

8 滑动窗口-无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…

观成科技-加密C2框架EvilOSX流量分析

工具简介 EvilOSX是一款开源的&#xff0c;由python编写专门为macOS系统设计的C2工具&#xff0c;该工具可以利用自身释放的木马来实现一系列集成功能&#xff0c;如键盘记录、文件捕获、浏览器历史记录爬取、截屏等。EvilOSX主要使用HTTP协议进行通信&#xff0c;通信内容为特…

Python 常用模块pickle

Python 常用模块pickle pickle序列化模块 【一】定义 序列化&#xff1a;将数据结构或对象转换为可存储或传输的格式反序列化&#xff1a;将序列化后的数据恢复为开始的数据结构或者对象 【二】目的 数据持久化存储远程通信缓存进程间通信 【三】序列化 将对象转换为字节…

蓝凌EIS pdf.aspx 任意文件读取漏洞

漏洞描述&#xff1a; 蓝凌EIS智慧协同平台是一个简单、高效的工作方式专为成长型企业打造的沟通、协同、社交的移动办公平台&#xff0c;覆盖OA、沟通、客户、人事、知识等管理需求&#xff0c;集合了非常丰富的模块&#xff0c;满足组织企业在知识、项目管理系统建设等需求的…

jmeter循环控制器

1.循环控制器 简单粗暴 写几次 循环几次 经常结合自定义变量使用 2.foreach控制器 搭配 变量一起使用的循环 一般变量的值是一个集合或者 是2个及2个以上的内容

[中阶]1月29-2月2晚8点-软件需求设计方法学全程实例剖析

建模方法学包含以下技能&#xff1a; A-业务建模——定位需要改进的目标组织&#xff08;人群或机构&#xff09;以及该组织接下来最需要改进的问题。 B-需求——描述为了改进组织的问题&#xff0c;所引入的信息系统必须具有的表现。 C-分析——提炼为了满足功能需求&#…

Redis过期清理策略和内存淘汰机制

目录 Redis过期清理策略Redis内存淘汰机制 Redis过期清理策略 Redis 通过设置键的过期时间来实现自动删除过期键。当键的过期时间到达时&#xff0c;Redis 会自动将该键删除。Redis 过期清理策略主要有以下两种&#xff1a; 惰性删除&#xff1a;Redis 在获取键时会检查键是否…

《ORANGE’S:一个操作系统的实现》读书笔记(二十七)文件系统(二)

上一篇文章我们记录了如何操作硬盘&#xff0c;并且编写了简单的硬盘驱动程序用于获取一些硬盘的参数。这篇文章就在上一篇文章的基础上记录文件系统&#xff0c;完善硬盘驱动程序。 文件系统 现在我们该仔细考虑如何构建一个文件系统了。这并不是我们第一次接触文件系统&…