Angular组件生命周期详解

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

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

在这里插入图片描述

  • 浅灰色名字的事件,在组件的生命周期中只会触发一次,而绿色的随着相应的逻辑变化会多次触发。
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的输入属性是指带**有@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)}}
}

在这里插入图片描述
当输入属性的值发生变化时:
在这里插入图片描述
ngOnChanges() 方法获取了一个对象,它把每个发生变化的属性名都映射到了一个SimpleChange对象,该对象中有属性的当前值和前一个值。这个钩子会在这些发生了变化的属性上进行迭代,并记录它们。

1.3 ngOnInit()

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

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

在这里插入图片描述
使用 ngOnInit() 方法执行以下初始化任务:

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

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

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

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

1.4 ngDoCheck()

在这里插入图片描述
这种情况不常见,如果是新手也没必要在这上面伤脑筋,只需要知道它会在ngOnInit()和每次ngOnChanges()之后调用。

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

1.5 ngAfterContentInit()

在这里插入图片描述
它会在 Angular 初始化完该指令的所有内容之后立即调用。要点:

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

1.6 ngAfterContentChecked()

在这里插入图片描述
在默认的变更检测器对该指令下的所有内容完成了变更检测之后立即调用。

1.7 ngAfterViewInit()

在这里插入图片描述
简单来说就是当组件视图渲染完成后调用,也就是说在这个函数执行之前是没有办法获取到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);}
}

在这里插入图片描述

1.8 ngAfterViewChecked()

在这里插入图片描述

<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);}
}

在这里插入图片描述

1.9 ngOnDestroy()

在这里插入图片描述

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

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

相关文章

Ubuntu 使用 nginx 搭建 https 文件服务器

Ubuntu 使用 nginx 搭建 https 文件服务器 搭建步骤安装 nginx生成证书修改 config重启 nginx 搭建步骤 安装 nginx生成证书修改 config重启 nginx 安装 nginx apt 安装&#xff1a; sudo apt-get install nginx生成证书 使用 openssl 生成证书&#xff1a; 到对应的路径…

案例精选|聚铭综合日志分析系统夯实徐州公交集团网络环境基础

徐州市公共交通集团有限公司成立于1960年&#xff0c;现隶属徐州市交通控股集团有限公司&#xff0c;下辖7家运营公司&#xff0c;1家站务公司&#xff0c;8家直属单位及13个职能部室。运营车辆2364辆&#xff0c;线路177条&#xff0c;线路长度3560公里&#xff0c;日发送班次…

云尘-Node1 js代码

继续做题 拿到就是基本扫一下 nmap -sP 172.25.0.0/24 nmap -sV -sS -p- -v 172.25.0.13 然后顺便fscan扫一下咯 nmap: fscan: 还以为直接getshell了 老演员了 其实只是302跳转 所以我们无视 只有一个站 直接看就行了 扫出来了两个目录 但是没办法 都是要跳转 说明还是需要…

@Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成

问题 Tag和Operation标签失效 但是Schema标签有效 pom依赖 <!-- 接口文档--><!--引入openapi支持--><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><vers…

51单片机电子钟闹钟温度LCD1602液晶显示设计( proteus仿真+程序+原理图+设计报告+讲解视频)

51单片机电子钟闹钟温度液晶显示设计( proteus仿真程序原理图设计报告讲解视频&#xff09; 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; &#x1f31f;51单片…

Python+requests+exce接口自动化测试框架

一、接口自动化测试框架 二、工程目录 三、Excel测试用例设计 四、基础数据base 封装post/get&#xff1a;runmethod.py #!/usr/bin/env python3 # -*-coding:utf-8-*- # __author__: hunterimport requests import jsonclass RunMain:def send_get(self, url, data):res req…

Day 5 登录页及路由 (三) 基于axios的API调用

系列文章目录 本系列记录一下通过Abp搭建后端&#xff0c;VueElement UI Plus搭建前端&#xff0c;实现一个小型项目的过程。 Day 1 Vue 页面框架Day 2 Abp框架下&#xff0c;MySQL数据迁移时&#xff0c;添加表和字段注释Day 3 登录页以及路由 (一&#xff09;Day 4 登录页以…

viteePress搭建组件文档

目录 安装vitepress 目录结构 文档首页 Home Page Hero 部分 Features 部分 导航栏配置 logo 导航链接 socialLinks 侧边栏 基本使用 多个侧边栏 使用组件 在 markdown 中导入组件 在 theme 中注册全局组件 部署到Github Pages 前提 第一步 第二步 …

大模型问答助手前端实现打字机效果 | 京东云技术团队

1. 背景 随着现代技术的快速发展&#xff0c;即时交互变得越来越重要。用户不仅希望获取信息&#xff0c;而且希望以更直观和实时的方式体验它。这在聊天应用程序和其他实时通信工具中尤为明显&#xff0c;用户习惯看到对方正在输入的提示。 ChatGPT&#xff0c;作为 OpenAI …

[ poi-表格导出 ] java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader

解决报错&#xff1a; org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错描述&#xff1a; 表格导出本来使用正常&#xff0c;偶然就报了以上错误…

项目实战:编辑页面加载库存信息

1、前端编辑页面加载水果库存信息逻辑edit.js let queryString window.location.search.substring(1) if(queryString){var fid queryString.split("")[1]window.onloadfunction(){loadFruit(fid)}loadFruit function(fid){axios({method:get,url:edit,params:{fi…

(四)docker:为mysql和java jar运行环境创建同一网络,容器互联

看了很多资料&#xff0c;说做互联的一个原因是容器内ip不固定&#xff0c;关掉重启后如果有别的容器启动&#xff0c;之前的ip会被占用&#xff0c;所以做互联创建一个网络&#xff0c;让几个容器处于同一个网络&#xff0c;就可以互联还不受关闭再启动ip会改变的影响&#xf…

opencv复习(简短的一次印象记录)

2-高斯与中值滤波_哔哩哔哩_bilibili 1、均值滤波 2、高斯滤波 3、中值滤波 4、腐蚀操作 卷积核不都是255就腐蚀掉 5、膨胀操作 6、开运算 先腐蚀再膨胀 7、闭运算 先膨胀再腐蚀 8、礼帽 原始数据-开运算结果 9、黑帽 闭运算结果-原始数据 10、Sobel算子 左-右&#x…

虚拟机部署与发布J2EE项目(Linux版本)

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.jdk安装配置 打开虚拟机 Centos 登入账号&#xff0c;并且使用MobaXterm进行连接 1.1. 传入资源 连接…

【ML】线性回归

线性回归 以房价为例。 单因子线性回归 房价和面积建立回归模型。 多因子线性回归 房价和面积、收入、房龄、地区人口数建立回归模型。 线性回归模型评估 MSE 越小越好&#xff0c; R 2 R^2 R2越接近1越好 MSE&#xff08;预测值y 和实际值y’ 的均方误差&#xff09; …

PostgreSQL 进阶 - 模式匹配,过滤敏感数据,数据清理

1. 模式匹配 SELECT phone_number FROM customers;使用正则表达式替换所有非数字字符 这样可以清理和标准化电话号码数据&#xff0c;去除任何非数字字符&#xff0c;只保留数字 UPDATE customers SET phone_number REGEXP_REPLACE(phone_number, [^0-9], , g) WHERE phone…

【C/C++笔试练习】new和deleted底层原理、静态数据成员、运算符重载、只能使用new创建的类、模版声明、另类加法、走方格的方案数

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;new和deleted底层原理&#xff08;2&#xff09;静态数据成员&#xff08;3&#xff09;运算符重载&#xff08;4&#xff09;程序分析&#xff08;5&#xff09;静态数据成员&#xff08;6&#xff09;只能使用new创建的…

【Qt】QMainWidget中的栏和菜单

默认结构最复杂的标准窗口 提供了菜单栏, 工具栏, 状态栏, 停靠窗口菜单栏: 只能有一个, 创建的最上方工具栏: 可以有多个, 默认提供了一个, 窗口的上下左右都可以停靠状态栏: 只能有一个, 窗口最下方停靠窗口: 可以有多个, 默认没有提供, 窗口的上下左右都可以停靠 菜单栏 在…

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…

day53【子序列】1143.最长公共子序列 1035.不相交的线 53.最大子序和

文章目录 1143. 最长公共子序列1035.不相交的线53. 最大子序和 1143. 最长公共子序列 题目链接&#xff1a;力扣链接 讲解链接&#xff1a;代码随想录讲解 题意&#xff1a;给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 …