zoukankan      html  css  js  c++  java
  • Angular组件生命周期

    1. 组件创建、变更至销毁的过程

    2. 所用函数(钩子)

      不必实现所有生命周期钩子,只要实现需要的那些就可以

    3.函数详解

    1. constructor     →   组件的构造函数,用于依赖注入(服务)或执行简单的数据初始化操作  有时也可使用ngOnInit进行声明或初始化
      constructor(public heroservice: HeroService) {//依赖注入
          // 执行初始化操作
         this.id=3;
          this.name = 'Semlinker'; 
        }
    2. ngOnChange()     →   当组件内的输入控件得到更新时,即值发生变化。组件会调用此函数(在ngOnInit之前调用)
    3. ngOnInit()      →       仅在ngOnChanges事件之后和构造函数之后获得其调用,用于初始化指令和组件的逻辑、数据 ,仅被调用一次    页面刷新时会调用
    4. ngDoCheck()     →     在ngOnInit之后立即随需应变(即使无变化),由Angular运行以检测任何更改
    5. ngAfterContentInit()      →   当第一次引入和检查组件的每个内容时(初始化内容),ngAfterContentInit将在ngDoCheck之后调用,仅被调用一次   
    6. ngAfterContentCheck()     →   当这个方法等待ngContentInit完成后才开始执行,同时也在所有ngDocheck之后执行。使用Angular变化检测机制来检查组件内容的修改
    7. ngAfterViewInit    →   在ngAfterContentChecked之后调用,在视图初始化之后,它只调用一次  一般DOM操作一般放在此方法内

    8. ngAfterViewChecked   →   ngAfterViewInit之后调用,并且为每个ngAfterContentChecked方法调用

    9. ngOnDestroy   →   在Angular销毁所有组件或指令之后调用,在从DOM中删除组件之前调用,负责清理逻辑,取消所有可观察对象的订阅,并分离事件处理程序,这样做可以防止内存泄漏。

    4.总结

    1. 当数据改变时,包括双向数据绑定:ngDoCheck()、ngAfterContentCheck()、ngAfterViewChecked()会依次执行
    2. 视图加载完成后会自动执行以下函数:constructor()、ngOnInit()ngDoCheck()ngAfterContentInit()ngAfterContentCheck()ngAfterViewInit()、ngAfterViewChecked()
    3. ngOnInit() ngAfterViewInit ngAfterContentInit()
      只会在整个生命周期执行一次
    4. 对于ngOnChange()  函数,只会在父组件传参到此模块(子模块)时才会执行,例如本例,页面加载时会调用,因为父组件会传值给子组件,若无传值,则不会执行此函数 ,同时当值改变时,会重新进行传值,也会执行此函数
    5. ngOnDestroy()在组件销毁时执行,例如下面代码,当flag为false时会销毁组件,执行此函数

    5.代码父组件传参到此模块(子模块)时

    父组件

    html

    <p>lifesub works!</p>
    <button (click)="changetitle()">改变传入子组件的title</button>
    <button (click)="changeflag()">销毁/ 挂载组件</button>
    <app-life [title2]="title1" *ngIf="flag"></app-life>

    TS

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'app-lifesub',
      templateUrl: './lifesub.component.html',
      styleUrls: ['./lifesub.component.css']
    })
    export class LifesubComponent implements OnInit {
      public title1:string='title';
      public flag=true;
      constructor() { }
    
      ngOnInit(): void {
      }
      changetitle(){
        this.title1="title_changed";
      }
      changeflag(){
        this.flag=!this.flag;
      }
    }

    子组件:

    html

    <p>life works!</p>
    <button (click)="changemsg()">改变组件数据</button>
    {{title2}}

    TS

    import { Component, OnInit, Input } from '@angular/core';
    
    @Component({
      selector: 'app-life',
      templateUrl: './life.component.html',
      styleUrls: ['./life.component.css']
    })
    export class LifeComponent {
      public msg:string='hhh';
      @Input() title2:string;
      
      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 = "数据改变了";
    }
    
    }

    6.效果

    由于无法解释的神圣旨意,我们徒然地到处找你;你就是孤独,你就是神秘,比恒河或者日落还要遥远。。。。。。
  • 相关阅读:
    [一起面试AI]NO.9 如何判断函数凸或非凸
    [一起面试AI]NO.8 在机器学习中,常用的损失函数有哪些?
    [一起面试AI]NO.5过拟合、欠拟合与正则化是什么?
    [一起面试AI]NO.4特征工程主要包括什么?
    [一起面试AI]NO.3分类问题常用的性能度量指标有哪些
    MySQL中自增ID修改起始值
    折半查找算法(Python版)
    彻底解决安卓7.0及以上版本抓包https失败
    Charles抓包2-Charles抓取https请求
    Charles抓包1-Charles安装汉化(附正版注册码)
  • 原文地址:https://www.cnblogs.com/momoli/p/13539857.html
Copyright © 2011-2022 走看看