在進入主題之前,先了解一下angular的生命周期。
生命周期
鈎子分類
-
指令與組件共有的鈎子
- ngOnChanges
- ngOnInit
- ngDoCheck
- ngOnDestroy
-
組件特有的鈎子
- ngAfterContentInit
- ngAfterContentChecked
- ngAfterViewInit
- ngAfterViewChecked
生命周期鈎子的作用及調用順序
- ngOnChanges - 當數據綁定輸入屬性的值發生變化時調用
- ngOnInit - 在第一次 ngOnChanges 后調用
- ngDoCheck - 自定義的方法,用於檢測和處理值的改變
- ngAfterContentInit - 在組件內容初始化之后調用
- ngAfterContentChecked - 組件每次檢查內容時調用
- ngAfterViewInit - 組件相應的視圖初始化之后調用
- ngAfterViewChecked - 組件每次檢查視圖時調用
- ngOnDestroy - 指令銷毀前調用
首次加載順序
export class demoComponent { constructor() { console.log('00構造函數執行了---除了使用簡單的值對局部變量進行初始化之外,什么都不應該做')--非生命周期函數 } ngOnChanges() { console.log('01ngOnChages執行了---當被綁定的輸入屬性的值發生變化時調用(父子組件傳值的時候會觸發)'); } ngOnInit() { console.log('02ngOnInit執行了--- 請求數據一般放在這個里面'); } ngDoCheck() { console.log('03ngDoCheck執行了---檢測,並在發生 Angular 無法或不願意自己檢測的變化時作出反應'); } 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 = "數據改變了"; } }
參照:https://www.cnblogs.com/Aerfajj/p/10748887.html
我們的要求是子組件監聽父組件傳入的值,而ngOnChanges的作用是當數據綁定輸入屬性的值發生變化時調用,正是我們所需要的。廢話不多說,直接上代碼:
父組件
<child-demo [tabValue]="tabValue"></child-demo>
子組件ts(與SimpleChange配合使用)
import {Component, EventEmitter, Input, OnInit, OnChanges, SimpleChange, Output} from '@angular/core'; @Component({ selector: 'app-child-demo', templateUrl: './child-demo.component.html', styleUrls: ['./child-demo.component.scss'] }) export class ChildDemoComponent implements OnInit { @Input() tabValue; @Output() gotoList: EventEmitter<{ goto: boolean, group: string}> = new EventEmitter<{goto: false, group: ''}>(); constructor(private childDemoService: ChildDemoService) { } ngOnInit() { } ngOnChanges(changes: SimpleChange){ if (changes['tabValue']) { //具體業務代碼 } } }
//changes['tabValue']有三個屬性,currentValue-當前值 previousValue-改變之前的值 firstChange-是否是第一次改變(previousValue為undefined時true,否則為false)
總結:
1.ngOnChanges只對@Input傳入的屬性發生變化時會調用。
2.當@Input屬性是一個對象,當對象的屬性值發生變化並不會觸發,當對象的引用發生變化時才會觸發。