Angular框架专题

Angular中的ngOnInit Hook和construct

2021-11-17  本文已影响0人  听书先生

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

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

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;
      })
  }

}

(参阅了其他资料)

上一篇 下一篇

猜你喜欢

热点阅读