Angular学习之聊聊组件通讯和组件生命周期

 2904

本篇文章带大家了解一下angular中的组件通讯组件生命周期,简单介绍一下向组件内部传递数据、组件向外部传递数据的方法,希望对大家有所帮助!


Angular学习之聊聊组件通讯和组件生命周期

组件通讯

1、向组件内部传递数据

  1. <app-favorite [isFavorite]="true"></app-favorite>
  1. // favorite.component.ts
  2. import { Input } from '@angular/core';
  3. export class FavoriteComponent {
  4.     @Input() isFavorite: boolean = false;
  5. }

注意:在属性的外面加 [] 表示绑定动态值,在组件内接收后是布尔类型,不加 [] 表示绑定普通值,在组件内接收后是字符串类型

  1. <app-favorite [is-Favorite]="true"></app-favorite>
  1. import { Input } from '@angular/core';
  2.  
  3. export class FavoriteComponent {
  4.   @Input("is-Favorite") isFavorite: boolean = false
  5. }


2、组件向外部传递数据

需求:在子组件中通过点击按钮将数据传递给父组件

  1. <!-- 子组件模板 -->
  2. <button (click)="onClick()">click</button>
  1. // 子组件类
  2. import { EventEmitter, Output } from "@angular/core"
  3.  
  4. export class FavoriteComponent {
  5.   @Output() change = new EventEmitter()
  6.   onClick() {
  7.     this.change.emit({ name: "张三" })
  8.   }
  9. }
  1. <!-- 父组件模板 -->
  2. <app-favorite (change)="onChange($event)"></app-favorite>
  1. // 父组件类
  2. export class AppComponent {
  3.   onChange(event: { name: string }) {
  4.     console.log(event)
  5.   }
  6. }


组件生命周期

Angular学习之聊聊组件通讯和组件生命周期

1、挂载阶段

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

1)、constructor

Angular 在实例化组件类时执行, 可以用来接收 Angular 注入的服务实例对象。

  1. export class ChildComponent {
  2.   constructor (private test: TestService) {
  3.     console.log(this.test) // "test"
  4.   }
  5. }

2)、ngOnInit

在首次接收到输入属性值后执行,在此处可以执行请求操作。

  1. <app-child name="张三"></app-child>
  1. export class ChildComponent implements OnInit {
  2.   @Input("name") name: string = ""
  3.   ngOnInit() {
  4.     console.log(this.name) // "张三"
  5.   }
  6. }

3)、ngAfterContentInit

当内容投影初始渲染完成后调用。

  1. <app-child>
  2.     <div #box>Hello Angular</div>
  3. </app-child>
  1. export class ChildComponent implements AfterContentInit {
  2.   @ContentChild("box") box: ElementRef<HTMLDivElement> | undefined
  3.  
  4.   ngAfterContentInit() {
  5.     console.log(this.box) // <div>Hello Angular</div>
  6.   }
  7. }

4)、ngAfterViewInit

当组件视图渲染完成后调用。

  1. <!-- app-child 组件模板 -->
  2. <p #p>app-child works</p>
  1. export class ChildComponent implements AfterViewInit {
  2.   @ViewChild("p") p: ElementRef<HTMLParagraphElement> | undefined
  3.   ngAfterViewInit () {
  4.     console.log(this.p) // <p>app-child works</p>
  5.   }
  6. }

2、更新阶段

1)、ngOnChanges

当输入属性值发生变化时执行,初始设置时也会执行一次,顺序优于 ngOnInit

不论多少输入属性同时变化,钩子函数只会执行一次,变化的值会同时存储在参数中

参数类型为 SimpleChanges,子属性类型为 SimpleChange

对于基本数据类型来说, 只要值发生变化就可以被检测到

对于引用数据类型来说, 可以检测从一个对象变成另一个对象, 但是检测不到同一个对象中属性值的变化,但是不影响组件模板更新数据。

基本数据类型值变化

  1. <app-child [name]="name" [age]="age"></app-child>
  2. <button (click)="change()">change</button>
  1. export class AppComponent {
  2.   name: string = "张三";
  3.   age: number = 20
  4.   change() {
  5.     this.name = "李四"
  6.     this.age = 30
  7.   }
  8. }
  1. export class ChildComponent implements OnChanges {
  2.   @Input("name") name: string = ""
  3.   @Input("age") age: number = 0
  4.  
  5.   ngOnChanges(changes: SimpleChanges) {
  6.     console.log("基本数据类型值变化可以被检测到")
  7.   }
  8. }

引用数据类型变化

  1. <app-child [person]="person"></app-child>
  2. <button (click)="change()">change</button>
  1. export class AppComponent {
  2.   person = { name: "张三", age: 20 }
  3.   change() {
  4.     this.person = { name: "李四", age: 30 }
  5.   }
  6. }
  1. export class ChildComponent implements OnChanges {
  2.   @Input("person") person = { name: "", age: 0 }
  3.  
  4.   ngOnChanges(changes: SimpleChanges) {
  5.     console.log("对于引用数据类型, 只能检测到引用地址发生变化, 对象属性变化不能被检测到")
  6.   }
  7. }

2)、ngDoCheck:主要用于调试,只要输入属性发生变化,不论是基本数据类型还是引用数据类型还是引用数据类型中的属性变化,都会执行。

3)、ngAfterContentChecked:内容投影更新完成后执行。

4)、ngAfterViewChecked:组件视图更新完成后执行。


3、卸载阶段

1)、ngOnDestroy

当组件被销毁之前调用, 用于清理操作。

  1. export class HomeComponent implements OnDestroy {
  2.   ngOnDestroy() {
  3.     console.log("组件被卸载")
  4.   }
  5. }


本文网址:https://www.zztuku.com/detail-12040.html
站长图库 - Angular学习之聊聊组件通讯和组件生命周期
申明:本文转载于《CSDN》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐