Angular 中的 constructor與ngOnInit 有什麼差別

Angular中的元件(component)啟動的時候,分別會觸發兩個事件

  • constructor:是javascript中class產生出來時候會執行的建構式
  • ngOnInit:則是Angular眾多生命週期中的其中之一,會在元件(component)啟動的時候觸發,

元件啟動順序:constructor > ngOnInit

src/app/app.component.ts
引入 OnInit
constructor()與ngOnInit()console.log(出現順序)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import { Component, OnInit } from '@angular/core';
import { RouterOutlet ,RouterLink} from '@angular/router';

@Component({
selector: 'app-root',
standalone: true,
imports: [
RouterOutlet,
RouterLink
],
templateUrl: './app.component.html',
styleUrl: './app.component.scss'
})


export class AppComponent implements OnInit{
constructor() {
console.log('constructor啟動了')
}
ngOnInit(): void {
console.log('ngOnInit啟動了')
}
title = 'tode_project';
}

測試結果順序結果:
constructor啟動了
ngOnInit啟動了
元件啟動順序:constructor > ngOnInit

定義變數值,變數顯示在頁面上順序:

normalValue的值:從ngOnInit取值 >
constructor的值:從constructor取值 >
ngOnInit的值:從ngOnInit取值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import { Component, OnInit } from '@angular/core';
import { RouterOutlet ,RouterLink} from '@angular/router';

@Component({
selector: 'app-root',
standalone: true,
imports: [
RouterOutlet,
RouterLink
],
templateUrl: './app.component.html',
styleUrl: './app.component.scss'
})


export class AppComponent implements OnInit{
normalValue='noValue'
constructorValue="noValue"
ngOnInitValue="noValue"
constructor() {
console.log('constructor啟動了')
this.constructorValue='從constructor取值'
this.normalValue='從constructor取值'
}
ngOnInit(): void {
console.log('ngOnInit啟動了');
this.ngOnInitValue='從ngOnInit取值'
this.normalValue='從ngOnInit取值'
}
title = 'tode_project';
}

測試渲染結果順序結果:

normalValue的值:從ngOnInit取值
constructor的值:從constructor取值
ngOnInit的值:從ngOnInit取值
測試渲染結果 結果:
不論在constructor或在ngOnInit賦值都是沒有問題的。
如果在constructor和ngOnInit連續賦值的話,就會依照小結一的結論照順序賦值,最後得到ngOnInit給予的值。

@Input的裝飾器,可以讓你從外部輸入到資料到元間裡面