在 Angular 学习过程中,相信很多初学者对 constructor 和 ngOnInit 的应用场景和区别会存在困惑,本文我们会通过实际的例子,为读者一步步解开困惑。 ngOnInit 是 Angular 组件生命周期中的一个钩子,Angular 中的所有钩子和调用顺序如下: ngOnChanges —— 当数据绑定输入属性的值发生变化时调用 ngOnInit —— constructor undefined ChildComponent ngOnInit Semlinker 我们发现在 ChildComponent 构造函数中,是无法获取输入属性的值,而在 ngOnInit ngOnInit 方法内能获取到输入的属性。 应用场景 在项目开发中我们要尽量保持构造函数简单明了,让它只执行简单的数据初始化操作,因此我们会把其他的初始化操作放在 ngOnInit 钩子中去执行。
例如,OnInit接口有一个名为ngOnInit的钩子方法,Angular在创建组件后立即调用: lib/src/peek_a_boo_component.dart (ngOnInit) class PeekABoo _logger); // implement OnInit's `ngOnInit` method void ngOnInit() { _logIt('OnInit'); } 在ngOnInit之前调用并且每当有一个或多个数据绑定输入属性发生变化时调用。 ngOnInit 在Angular首次显示数据绑定属性并设置指令/组件的输入属性后,初始化指令/组件。 当ngOninit运行时,它们将被设置。 ngOnChanges方法是您第一次访问这些属性的机会。 在ngOnInit之前Angular会调用ngOnChanges ...并在此之后多次调用。 它只调用一次ngOnInit。 您可以期待Angular在创建组件后立即调用ngOnInit方法。 这就是深度初始化逻辑所属的地方。
father.template.html' }) export class FatherComponent implements OnInit { data: any = '我是传往子组件的值' ngOnInit child.template.html' }) export class ChildComponent implements OnInit { @Input() data: any;//接收父组件的值 ngOnInit OnInit { @Output('checked') checkedBack = new EventEmitter<any>(); id:any ="我是传给父组件的值" ngOnInit /father.template.html' }) export class FatherComponent implements OnInit { ngOnInit() { }
比如,OnInit接口的钩子方法叫做ngOnInit。 指令和组件 ngOnInit:当Angular初始化完成数据绑定的输入属性后,用来初始化指令或者组件。 生命周期的顺序 ngOnChanges:当被绑定的输入属性的值发生变化时调用,首次调用一定会发生在ngOnInit之前。 ngOnInit:在第一轮ngOnChanges完成之后调用。
(达内教育学习笔记)仅供学习交流 Angular核心-组件的生命周期函数钩子函数 Angular核心-组件的生命周期函数钩子函数constructor()ngOnChanges()ngOnInit 如果组件绑定过输入属性,那么在 ngOnInit() 之前以及所绑定的一个或多个输入属性的值发生变化时都会调用。 ngOnInit() 重点 组件初始化完毕等同于Vue.js的mounted 在第一轮 ngOnChanges() 完成之后调用,只调用一次。 而且即使没有调用过 ngOnChanges(),也仍然会调用 ngOnInit()(比如当模板中没有绑定任何输入属性时)。 ngDoCheck() 组件检查到了系统对自己的影响。 注意:紧跟在每次执行变更检测时的 ngOnChanges() 和 首次执行变更检测时的 ngOnInit() 后调用。 注意:基本用不上。
如果有输入属性,会在ngOnInit之前调用。 ngOnInit 在组件初始化的时候调用,只调用一次,在第一次调用ngOnChanges之后调用 ngDoCheck 在组件定义的属性或方法变更时调用(用于脏值之检测,非常耗性能,因为会把所有的属性和方法都检测一遍 ),会在ngOnChanges()和ngOnInit()之后 ngAfterContentInit 在组件内容初始化之后调用,在第一次ngDoCheck之后调用,只调用一次 ngAfterContentChecked 上面代码书写是按顺序的,看下面控制台打印: 现在我们钩子函数的顺序打乱,在看看代码 控制台输出跟上面是一样的 constructor和ngOnInit constructor是ES6中class ngOnInit是Angular中生命周期的一部分,在constructor后执行。在Angular中用于初始化变量和数据绑定等 NgChanges 当我们监听了OnChanges钩子。
angular 中,生命周期执行的顺序如下: - constructor 【常用,不算钩子函数,但是很重要】 - ngOnChanges【常用】 - ngOnInit【常用】 - ngDoCheck 这在下面的 ngOnInit 总会介绍。 ngOnInit 这个方法调用的时候,说明组件已经初始化成功。在第一次 ngOnChanges() 完成之后调用,且只调用一次。 () { console.log('3. ngOnInit') } } 打印的信息如下: 咦? () { console.log('3. demo ngOnInit') } } 当通过 @Input 将值传递给子组件 demo 的时候,就会触发 demo 组件中的 ngOnChanges 这个钩子函数,紧跟在每次执行变更检测时候 ngOnChanges 和首次执行执行变更检测时 ngOnInit 后面调用。
: string; constructor() { } ngOnInit(): void { } } 子组件接受父组件传入的变量 parentProp,回填到页面。 <! export class CommunicateComponent implements OnInit { public msg:string = '' constructor() { } ngOnInit OnInit { // 子组件的属性 public childMsg:string = 'Prop: message from child' constructor() { } ngOnInit : ChildComponent; constructor() { } ngOnInit(): void { this.getChildPropAndMethod() } private parentAndChildService: ParentAndChildService ) { } // 为了更好理解,这里我移除了父组件的 Subject ngOnInit
` }) export class AppComponent implements OnInit { constructor(private http: HttpClient) { } ngOnInit jsonplaceholder.typicode.com/users') .subscribe(users => console.log(users)); } } 上面示例中,我们通过依赖注入方式注入 HttpClient 服务,然后在 ngOnInit apiUrl = 'https://jsonplaceholder.typicode.com/users'; username: string = ''; user: any; ngOnInit apiUrl = 'https://jsonplaceholder.typicode.com/users'; username: string = ''; user: any; ngOnInit HttpClient) { } apiUrl = 'https://jsonplaceholder.typicode.com/posts'; post1: any; post2: any; ngOnInit
ngOnChanges 当被绑定的输入属性的值发生变化时调用,首次调用一定会发生在 ngOnInit之前。 OnChanges 指令和组件 ---- ngOnInit() 在第一轮 ngOnChanges 完成之后调用。 ( 译注:也就是说当每个输入属性的值都被触发了一次 ngOnChanges 之后才会调用 ngOnInit ,此时所有输入属性都已经有了正确的初始绑定值 ) OnInit 指令和组件 ---- ngDoCheck
<app-button></app-button> export class HeaderComponent implements OnInit { constructor() {} ngOnInit export class TitleComponent implements OnInit { public title: string = '标题'; constructor() {} ngOnInit export class ButtonComponent implements OnInit { public btnName: string = '按钮'; constructor() {} ngOnInit 组件的ts类中增加titleChange属性: @Output() public titleChange = new EventEmitter(); 在title组件的ts类中定时派发数据 ngOnInit 在title组件的ngOnInit()钩子中保存title到localstorage中: window.localStorage.setItem('title', this.title); 在button
app.component.html' }) export class AppComponent { constructor(private http: HttpClient) { } ngOnInit ngOnInit() { this.http.get('/api/people/1').subscribe(character => { this.http.get(character.homeworld class AppComponent { homeworld: Observable<{}>; constructor(private http: HttpClient) { } ngOnInit export class AppComponent { loadedCharacter: {}; constructor(private http: HttpClient) { } ngOnInit
HomeComponent implements OnInit { //声明一个需要绑定的变量 public inputData:string = "" constructor() { } ngOnInit (): void { console.log("ngOnInit====>") } } 数据的获取
/home.component.less'] }) export class HomeComponent implements OnInit { constructor() { } ngOnInit (): void { console.log("ngOnInit====>") } ngOnChanges(){ console.log("ngonchanges====>") ChildrenComponent implements OnInit { //使用@Input装饰器接收整个父组件 @Input() home:any constructor() { } ngOnInit { } //通过Output进行子组件给父组件传递数据 childOut 是自己随意起的名字 @Output() public childOut = new EventEmitter() ngOnInit /parent.component.less'] }) export class ParentComponent implements OnInit { constructor() { } ngOnInit
\n\n通常,我们都会在组件的 ngOnInit() 钩子函数中获取数据。也就是说,组件加载完之后,我们发起数据请求。 \n\n在 ngOnInit() 中操作,我们需要在每个需要的组件加载后,在其路由页面中添加 loader 展示。Resolver 可以简化 loader 的添加使用。 \n\nloader 通常是在 ngOnInit() 中编写所有的 AJAX 请求,但是逻辑将会在 resolver 中实现,替代 ngOnInit()。
class LoginPage implements OnInit { constructor(private authService: AuthenticationService) { } ngOnInit /register.page.scss'], }) export class RegisterPage implements OnInit { constructor() { } ngOnInit DashboardPage implements OnInit { constructor(private authService: AuthenticationService) { } ngOnInit
/p>
export class HomeComponent implements OnInit { constructor() { } public msg:string="这是父组件的msg"; ngOnInit HeaderComponent implements OnInit { constructor() { } @Input() msg:any; @Input() run:any; ngOnInit
DemoComponent implements OnInit { name: string = 'Tom'; constructor(public http: HttpClient) {} ngOnInit getNewName').subscribe((data: string) => { this.name = data; }); } } 我们在这个组件的 ngOnInit export class DemoComponent implements OnInit { name: string = 'Tom'; constructor() {} ngOnInit Jerry' setTimeout(() => { this.name = 'Jerry'; }, 1000); } } 我们在这个组件的ngOnInit implements OnInit { title: string = '组件标题'; constructor(public cdRef: ChangeDetectorRef) {} ngOnInit