美文网首页Angular框架专题
Angular中的ngOnInit Hook和construct

Angular中的ngOnInit Hook和construct

作者: 听书先生 | 来源:发表于2021-11-17 10:56 被阅读0次

    constructor是ES6中类中的构造函数,在angular中,组件页面都是通过写在export class someComponent { }中完成的,因此每个类中都会有一个constructor构造函数,在使用Angular框架的时候,经常会迷惑到底何时使用constructor,何时使用ngOnInit生命周期钩子函数?

    • Angular中的生命周期的执行顺序如下:
      1、ngOnChanges - 当数据绑定输入属性的值发生变化时调用
      2、ngOnInit - 在第一次 ngOnChanges 后调用
      3、ngDoCheck - 自定义的方法,用于检测和处理值的改变
      4、ngAfterContentInit - 在组件内容初始化之后调用
      5、ngAfterContentChecked - 组件每次检查内容时调用
      6、ngAfterInit - 组件相应的视图初始化之后调用
      7、ngAfterViewChecked - 组件每次检查视图时调用
      8、ngOnDestroy - 指令销毁前调用

    ngOnInit一般用于组件初始化,这个钩子函数在ngOnChanges之后执行

    • constructor的使用:

    constructor使用时一般是当这个组件被注册的时候就会执行其中的构造函数,可以对比下面的例子

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'my-app',
      template: `
      <span>{{name}}</span>
      `,
    })
    export class AppComponent implements OnInit {
    
      public name:string = '';
    
      constructor() {
        console.log('constructor初始化');
        this.name = 'Violet';
      }
    
      ngOnInit() {
        console.log('ngOnInit hook');
      }
    }
    
    //  页面渲染的name为Violet
    //  打印内容:constructor初始化   then  ngOnInit hook
    
    

    可以看出,constructor构造函数在组件一注册的时候就执行了,其后才是组件的初始化,意味着有的数据不能放在constructor中去做的,最经典的应用场景就是:父子组件传值的时候,子组件在constructor构造函数中是无法拿到父组件传过来的数据的,因为这个时候组件才刚刚被注册,需要待初始化之后才可以拿到数据。

    父组件代码:

    import { Component } from '@angular/core';
    
    @Component({
      selector: 'my-parent',
      template: `
        <my-child [pid]="id"></my-child>
      `,
    })
    export class ParentComponent {
      id:number= 0;
    
      constructor() {
        this.id= 1;
      }
    }
    
    

    子组件代码:

    import { Component, Input, OnInit } from '@angular/core';
    
    @Component({
        selector: 'my-child',
        template: `
         <span>传过来的id:{{ pid }} </span>
        `
    })
    export class ChildComponent implements OnInit {
        @Input() pid: number; // 传过来的id
    
        constructor() {
            console.log('constructor构造函数:', this.pid); 
        }
    
        ngOnInit() {
            console.log('ngOnInit钩子函数:', this.pid);
        }
    }
    
    //  打印内容:undefined  then  1
    
    
    • 应用场景:

    构造函数一般用于依赖注入或执行一些简单的初始化操作,把其他的初始化操作放在 ngOnInit 钩子中去执行。如在组件获取输入属性之后,需执行组件初始化操作等。

    import { Component, OnInit } from "@angular/core";
    import { Http } from "@angular/http";
    
    @Component({
      selector:'my-select',
      template:`<ul>
          <li *ngFor = "let item in data">
              {{ item }}
          </li>
        </ul>`
    })
    
    export class CountComponent {
      
      public data = [];
    
    
      constructor(private http: Http) {}
    
      ngOnInit() {
         const url = '接口地址'   
         this.http.get(url).subscribe(res=> {
            this.data = res.retList;
          })
      }
    
    }
    

    (参阅了其他资料)

    相关文章

      网友评论

        本文标题:Angular中的ngOnInit Hook和construct

        本文链接:https://www.haomeiwen.com/subject/blcltrtx.html