Angular-07:组件生命周期

三个阶段:

  • ① 挂载阶段
    • 1.1 constructor
    • 1.2 ngOnInit
  • ② 更新阶段
    • 2.1 ngOnChanges
    • 2.2 ngAfterViewInit
    • 2.3 ngAfterContentInit
    • 2.4 ngDoCheck
  • ③ 卸载阶段
    • 3.1 onOnDestroy
  • ④ 在组件中添加所有方法并打印

该表按照执行顺序编写

编号函数名实现名说明
1constructorconstructor接收服务实例化对象
2ngOnChangesOnChanges当输入属性值发生变化时执行
3ngOnInitOnInit在首次接收到输入属性值后执行
4ngDoCheckDoCheck主要用于调试,每次变化检测发生时调用
5ngAfterContentInitAfterContentInit当内容投影初始渲染完成后调用
6ngAfterContentCheckedAfterContentChecked内容投影更新完成后执行
7ngAfterViewInitAfterViewInit当组件视图渲染完成后调用
8ngAfterViewCheckedAfterViewChecked组件视图更新完成后执行
9ngOnDestroyOnDestroy组件被销毁之前调用

① 挂载阶段

该阶段生命周期函数只执行一次,数据更新时不再执行。

1.1 constructor

  1. 不是组件生命周期函数,是组件类的构造函数,但是他属于挂载阶段
  2. 建议只接收服务实例化对象,不要干其他的事
  3. angular实例化组件类时执行,可以用来接收angular注入的服务实例对象。

例: 创建一个服务“TestService”, 在组件中注入服务并在constructor中打印查看结果

TestService:

import { Injectable } from '@angular/core';@Injectable({providedIn: 'root'
})
export class TestService {testTip = "test,来自服务的消息";constructor() { }}
export class OtherComponent implements OnInit{constructor(private TestService: TestService) {console.log("this.TestService--", this.TestService.testTip);  // test,来自服务的消息}
}

结果:
在这里插入图片描述


1.2 ngOnInit

在首次接收到输入属性后执行,也用来做初始化任务执行

例: 创建一个子组件,在父组件中传递给子组件一个输入值,在子组件中打印查看结果。

在父组件中的子组件标签定义好属性

<!-- 父组件模板 --><app-son [sonName]="'王二小'"></app-son>

子组件接收该属性值并打印

// 子组件类
export class SonComponent implements OnInit {@Input() sonName: string = '';constructor() { }ngOnInit() {console.log("sonName", this.sonName);   // 王二小}}

结果:
在这里插入图片描述


② 更新阶段

2.1 ngOnChanges

  1. 输入属性发生变化时执行,初始设置时也会执行一次。响应组件输入值发生变化时出发。(顺序优先于ngOnInit)
  2. 不论有多少个输入属性同时变化,该钩子只会执行一次,变化的值会同时存储在参数中。(多个输入属性一起传递,钩子函数会同时处理)
  3. 参数的类型为SimpleChanges,子属性类型为SimpleChange。
  4. 对于基本数据类型来说,只要值发生改变就可以被该函数检测到。
  5. 对于引用数据类型来说,可以检测从一个对象变成另一个对象(整个对象重新赋值,引用地址发生了变化),但是检测不到同一个对象中属性值的变化(某个属性值被改变),但是不影响组件模板更新数据。(钩子函数捕捉不到改变,但是在组件模板中会变化)

例1:基本数据类型值变化

  1. 给子组件传递一个基本数据类型属性 sonName,值为:王二小。
  2. 定义一个按钮,点击按钮时将该值改为:李四。
<!-- 父组件 -->
<app-son [sonName]="sonName"></app-son>
<button (click)="changeName()">换个名字</button>
// 父组件类sonName: string = '王二小';changeName() {this.sonName = "李四";}

在子组件类中接收该值,并在ngOnChanges方法中添加打印,查看该值的变化

// 子组件类@Input() sonName: string;ngOnChanges(changes: SimpleChanges): void {console.log("changes", changes);console.log("sonName", this.sonName);}
  1. 基本数据类型的值改变可以在该方法中被检测到
  2. SimpleChanges对象:包含当前值和变化前的值。输入属性值发生变化时触发。
    在这里插入图片描述

例2:引用数据类型对象属性变化

  1. 给子组件传递一个对象 sonInfo,值为:{ name: “王二小”, age: 18 }。
  2. 定义一个按钮,点击按钮时将该对象的属性改变。
<!-- 父组件模板 --><app-son [sonInfo]="sonInfo"></app-son>
<button (click)="changeInfo()">换个信息</button>

在父组件类中改变该对象的属性

// 父组件类sonInfo = { name: "王二小", age: 18 };changeInfo() {this.sonInfo.name = "李四";this.sonInfo.age = 3;}
  1. 在子组件类中接收该对象sonInfo,并在ngOnChanges中添加打印
// 子组件类@Input() sonInfo: Object;ngOnChanges(changes: SimpleChanges): void {console.log("changes", changes);console.log("sonInfo", this.sonInfo);}

在子组件模板中将该对象显示

<!-- 子组件模板 --><p>{{sonInfo | json}}</p>

最终结果:

  1. 初始化的时候ngOnChanges方法会打印接收的input对象。
  2. 在父组件中点击按钮改变对象属性时,该对象传递到子组件中。
  3. 由于值改变了对象属性,ngOnChanges方法无法检测到该对象的变化,不会输出打印。
  4. 但是在子组件模板中可以看到,该对象已经由最初的 “王二小” 变为了 “李四” 。在这里插入图片描述

例3:引用数据类型引用地址变化

  1. 同例2逻辑,这次在父组件传递给子组件值时改变对象赋值方式。
  2. 在点击按钮时,在父组件中对象重新赋值。(改变对象的引用地址)
// 父组件组件类
sonInfo = { name: "王二小", age: 18 };changeInfo() {this.sonInfo = { name: "李四", age: 3 };}

最终结果:
每次点击按钮,ngOnChanges都会检测到该对象的变化
在这里插入图片描述


2.2 ngAfterViewInit

  1. 组件视图渲染完成后调用。
  2. angular创建完成组件视图及其子视图之后。

2.3 ngAfterContentInit

  1. 当内容投影初始渲染完成调用。
  2. 组件中使用了将内容嵌入组件视图后会调用,在第一次ngDoCheck执行后调用,且只执行一次。

2.4 ngDoCheck

  1. 用于变化检测,该钩子方法会在每次变化检测发生时调用。
  2. 不管数据值是否发生了变化,都会被调用,该钩子方法需慎用。该方法内不能写复杂代码,会影响性能。
  3. 例如鼠标移动事件,变化检测会频繁触发,该钩子方法会频繁调用。
  4. ngDoCheck和ngOnChange不建议同时使用。

③ 卸载阶段

3.1 onOnDestroy

  1. 什么是卸载?
    组件所对应的dom元素被移除就是卸载。避免发生内存泄漏等问题。
  2. 当组件被销毁之前调用,用于清理操作。
  3. 一个经典应用场景,从a页面b页面时,a页面所对应的组件就会被卸载掉。
  4. 需要在该函数内处理:已订阅的观察者事件清理,定时器清理,绑定的dom清理(一些不会被垃圾回收器自动回收的资源)

④ 在组件中添加所有方法并打印

在组件中,所有方法的无序的排列(未按照执行顺序排列)。因为每个方法有自己的特有的执行条件,并非按照先后顺序执行。

@Component({selector: 'app-son',templateUrl: './son.component.html',styleUrls: ['./son.component.css']
})
export class SonComponent implements OnInit, AfterViewInit, AfterContentInit, OnChanges, DoCheck, AfterContentChecked, AfterViewChecked, OnDestroy {constructor() {console.log("constructor");}ngAfterViewChecked(): void {console.log("ngAfterViewChecked");}ngOnDestroy(): void {console.log("ngOnDestroy");}ngAfterContentChecked(): void {console.log("ngAfterContentChecked");}ngDoCheck(): void {console.log("ngDoCheck");}ngOnChanges(changes: SimpleChanges): void {console.log("ngOnChanges");}ngAfterContentInit(): void {console.log("ngAfterContentInit");}ngOnInit() {console.log("ngOnInit");}ngAfterViewInit(): void {console.log("ngAfterViewInit");}}

执行结果:
在这里插入图片描述

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

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

相关文章

Java 开发常用的 Linux 命令

基本操作 Linux关机,重启 # 关机 shutdown -h now# 重启 shutdown -r now查看系统,CPU信息 # 查看系统内核信息 uname -a# 查看系统内核版本 cat /proc/version# 查看当前用户环境变量 envcat /proc/cpuinfo# 查看有几个逻辑cpu, 包括cpu型号 cat /proc/cpuinfo | grep name …

【Spring Boot 源码学习】JedisConnectionConfiguration 详解

Spring Boot 源码学习系列 JedisConnectionConfiguration 详解 引言往期内容主要内容1. RedisConnectionFactory1.1 单机连接1.2 集群连接1.3 哨兵连接 2. JedisConnectionConfiguration2.1 RedisConnectionConfiguration2.2 导入自动配置2.3 相关注解介绍2.4 redisConnectionF…

FreeRTOS笔记【一】 任务的创建(动态方法和静态方法)

一、任务创建和删除API函数 函数描述xTaskCreate()使用动态的方法创建一个任务xTaskCreateStatic()使用静态的方法创建一个任务xTaskCreateRestricted()创建一个使用MPU进行限制的任务&#xff0c;相关内存使用动态内存分配vTaskDelete()删除一个任务 二、动态创建任务 2.1 …

C语言——选择排序

完整代码&#xff1a; //选择排序 // 选择排序是一种简单直观的排序算法。它的工作原理如下:首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&am…

已完结,给小白的《50讲Python自动化办公》

大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯也叫这个名。 写在前面 上个周末去成都参加了第8届中国开源年会&#xff0c;认识了很多行业前辈和优秀的同龄人。 我发现在工作之外还能有一番事业的人&#xff0c;都有一个让我羡慕的共同点&#xff1a;有一个拿得出手…

Ubantu安装教程(其实和之前CentOS差不多)

文章目录 VM安装见下方参考链接Ubuntu安装我的是Ubuntu22.04.3官网下载我下载的桌面版LTS代表长期支持-这意味着五年的免费安全和维护更新选好版本点击下载就好&#xff08;注意桌面版和服务器版&#xff09; 搭建虚拟机个性化名字自定义安装位置不知道就先默认就好&#xff0c…

Java与Redis的集成

目录 Java连接Redis 导入依赖 Redis服务器准备 建立连接 Java操作Redis常用类型数据 Redis字符串(String) Redis哈希(Hash) Redis列表&#xff08;List&#xff09; Redis集合&#xff08;Set&#xff09; Redis有序集合&#xff08;Sorted Set&#xff09; Redis在项目应用…

类和对象解析

导言&#xff1a; Java是一门纯面向对象的语言&#xff0c;在面对对象的世界里&#xff0c;一切皆为对象。而对象的创建又和类的定义息息相关。本文主要阐述了类和对象的使用与理解。解释类的定义方式以及对象的实例化&#xff0c;类中的成员变量和成员方法的使用&#xff0c;…

Python基础入门例程45-NP45 禁止重复注册(条件语句)

最近的博文&#xff1a; Python基础入门例程44-NP44 判断列表是否为空&#xff08;条件语句&#xff09;-CSDN博客 Python基础入门例程43-NP43 判断布尔值&#xff08;条件语句&#xff09;-CSDN博客 Python基础入门例程42-NP42 公式计算器&#xff08;运算符&#xff09;-C…

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限

一、什么是分类问题&#xff1f; 在分类问题中&#xff0c;我们试图预测的变量&#x1d466;是离散的值&#xff0c;通常表示某种类别或标签。这些类别可以是二元的&#xff0c;也可以是多元的。分类问题的示例包括&#xff1a; 判断一封电子邮件是否是垃圾邮件&#xff08;二…

基于鹰栖息算法的无人机航迹规划-附代码

基于鹰栖息算法的无人机航迹规划 文章目录 基于鹰栖息算法的无人机航迹规划1.鹰栖息搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鹰栖息算法来优化无人机航迹规划。 1.鹰栖息…

汽车标定技术(二)--基于XCP的标定测量实战

目录 1.工程创建 1.1 新建工程 1.2 设备配置 1.3 标定观测 1.4 刷写 2.原始hex文件与标定文件的合并 2.1 修改memory segment file 2.2 标定量地址偏移 ​编辑 2.3 标定后与原始hex文件合并 2.4 标定后直接merge 2.5 不用对ram地址进行偏移实现hex文件合并 本文使用…

linux 安装 elasticsearch 全教程

一、去 elasticsearch官网找到Linux版本的下载链接 地址https://www.elastic.co/cn/downloads/elasticsearch 二、在linux 中用wget下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-linux-x86_64.tar.gz三、下载成功后解压文件 tar -x…

Quartz之JDBC-JobStoreTX配置

一、前言 上篇 《Quartz介绍》中使用的是RAMJobStored存储调度信息&#xff0c;当进程终止调度信息会丢失&#xff0c;本篇我们介绍使用JDBCJobStore来存储调度信息&#xff08;jobs、Triggers和日历&#xff09;。 二、Quartz 表结构 可以从官网&#xff08;http://www.qua…

java入门-JDK下载与安装

1、下载jdk Java 的产品叫JDK&#xff08;Java Development Kit: Java开发者工具包&#xff09;&#xff0c;必须安装JDK才能使用java 1、官网地址 https://www.oracle.com/java/ https://www.oracle.com/java/technologies/downloads/ 目前比较稳定的版本为 JDK17. 我们就安…

node教程(五)接口+会话

文章目录 一.接口1.1接口是什么?1.2接口的作用1.3接口的开发与调用1.4接口的组成 一.接口 1.1接口是什么? 接口是前后端通信的桥梁 1.2接口的作用 实现前后端通信 1.3接口的开发与调用 大多数接口都是由后端工程师开发的&#xff0c;开发语言不限 一般情况下接口都是由…

Mac 下安装golang环境

一、下载安装包 安装包下载地址 下载完成&#xff0c;直接继续----->下一步到结束即可安装成功&#xff1b; 安装成功之后&#xff0c;验证一下&#xff1b; go version二、配置环境变量 终端输入vim ~/.zshrc进入配置文件&#xff0c;输入i进行编辑 打开的不管是空文本…

【数据开发】大数据平台架构,Hive / THive介绍

1、大数据引擎 大数据引擎是用于处理大规模数据的软件系统&#xff0c; 常用的大数据引擎包括Hadoop、Spark、Hive、Pig、Flink、Storm等。 其中&#xff0c;Hive是一种基于Hadoop的数据仓库工具&#xff0c;可以将结构化的数据映射到Hadoop的分布式文件系统上&#xff0c;并提…

Linux上编译sqlite3库出现undefined reference to `sqlite3_column_table_name‘

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 在Ubuntu 18上编译sqlite3库后在运行程序时出现undefined reference to sqlite3_column_table_name’的错误。网上的说法是说缺少SQLITE_ENABLE_COLUMN_M…

基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(六)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 这节主要讲条件节点与并发节点的有效性检查&#xff0c;主要是增加这两个节点的子节点检查&#xff0c;因为…