[Angular 基础] - 生命周期函数

这篇具有很好参考价值的文章主要介绍了[Angular 基础] - 生命周期函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[Angular 基础] - 生命周期函数


之前的笔记:

  • [Angular 基础] - Angular 渲染过程 & 组件的创建

  • [Angular 基础] - 数据绑定(databinding)

  • [Angular 基础] - 指令(directives)

    以上为静态页面,即不涉及到跨组件交流的内容

    以下涉及到组件内的沟通,从这开始数据就“活”了

  • [Angular 基础] - 自定义事件 & 自定义属性

  • [Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递


看了一下,从 v2 开始的生命周期好像就没变过,这是从 archive 的 v2 官网上拉下来的一张图:

[Angular 基础] - 生命周期函数,# Angular,angular.js,javascript,前端

数量和顺序都是一样的,蓝色部分则是与 投射(projection) 有关

这篇笔记相对而言比较枯燥是真的……也没办法……

constructor

虽然说生命周期函数里没有明确的包含构造函数,这里还是提一下

构造函数是最先运行的,同时这里的操作 应该 省时省力,不应该 触发任何的副作用,它唯一的作用就是对变量赋初始值

ngOnChanges

这是第一个调动的生命周期,也是调动最频繁的生命周期函数,组件中的变化都会触发这个函数的调用

官方文档中提到,如果当前组件内没有任何 @Input 的话,那么 ngOnChanges 就不会被调用。同样,因为同一个组件内只能存在一个 ngOnChanges,因此它的功能有点像 useEffect 的依赖数组中加上了所有的变量,或者对应的 class based component 中的 componentDidUpdate

实现如下:

export class ServerElementComponent {
  @Input('element') aliasElement: ServerElement;

  ngOnChanges(changes: SimpleChanges) {
    console.log('ngOnChanges in ServerElementComponent');
    console.log(changes);
  }
}

SimpleChanges 也是从 @angular/core 中导出的,数据结构如下:

class SimpleChange {
  constructor(previousValue: any, currentValue: any, firstChange: boolean);
  previousValue: any;
  currentValue: any;
  firstChange: boolean;
  isFirstChange(): boolean;
}

页面输出如下:

[Angular 基础] - 生命周期函数,# Angular,angular.js,javascript,前端

同样的代码我在 cockpitserver-element 都有输出,但是 cockpit 没有 @Input,因此 ngOnChanges 就没有触发

这就是上面中提到的,

当前组件内没有任何 @Input 的话,那么 ngOnChanges 就不会被调用

换言之,ngOnChanges 是针对 @Input 的变化而被调动的

⚠️:ref 不会引起 ngOnChanges 的调用,并且,如果被 @Input 绑定的对象的 reference 没有变化,也是不会引起 ngOnChanges 的调用

👀:如果优化做的比较好的话,ngOnChanges 能够有效的提升性能

ngOnInit

ngOnInit 会在 ngOnChanges 第一次后调用,如果 ngOnChanges 没有被触发,那么 ngOnInit 就是第一个调用生命周期函数。这个函数也类似于 componentDidMount,也就是 useEffect 中为空数组的实现,同理可证,这也是一个适合触发一个副作用的地方

具体实现如下:

  ngOnInit() {
    console.log('ngOnInit in CockpitComponent');
  }

效果如下:

[Angular 基础] - 生命周期函数,# Angular,angular.js,javascript,前端

ngDoCheck

ngDoCheck 会在 ngOnChangesngOnInit 运行后运行,不过对比 ngOnChanges 没有 @Input 就不会运行的情况,ngDoCheck 只要有变化,就会运行,这个变化包括 @Input、对象等

这也是一个类似于 componentDidUpdate 的生命周期函数

因为 ngDoCheck 会在每一次变化被感知后运行,所以这里也是和添加自定义的变化感知,如:

export class MyComponent implements DoCheck {
  @Input() items: any[];

  private oldItems: any[];

  ngDoCheck() {
    if (
      this.items &&
      this.oldItems &&
      this.items.length !== this.oldItems.length
    ) {
      console.log('Items array has changed');
    }
    this.oldItems = [...this.items];
  }
}

这样的实现比起直接将数据绑定到 @Input() 的优点就在于获取了 previous snapshot 的值,也就类似于 componentDidUpdate(prevProps, prevState, snapshot) 这里面的参数

但是如果 change 是和 @Input 进行绑定的,目前则是可以用 SimpleChanges 中的 firstChange + previousValue + currentValue 去解决,这样更加的方便快捷

几个使用 ngDoCheck 而不是 ngOnChanges 的场景:

  • 检查更加复杂的对象,这一块之后学习到 KeyValueDiffers 再继续补全

  • 事件触发,但是没有值的变化,如鼠标点击事件、键盘事件、冒泡事件等

  • 异步的情况,如 subscribe 发生后的情况,这一部分也会在学到了异步操作后补全

    本质上来说这也是一个事件触发

ngAfterContentInit

这个生命周期的调用是在 ngOnInit 后,ngDoCheck 后调用,并且只会被调用一次

说到 ngAfterContentInitngOnInit 的区别就需要简单的谈一下 Angular 的创造顺序:

  • 父组件先被创建

  • 子组件随后被创建

  • 调用生命周期函数

    ngOnInit 在这个地方被调用

  • 投射内容

    ngAfterContentInit 在这里被调用

    这时候如果使用 ng-content 进行内容的投射,在内容透射完毕后,ngAfterContentInit 就会被调用以表示当前组件已经准备好了,可以完整的被渲染了

    ng-content 部分的内容回顾在这里:[Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递

  • View 层完成初始化

    这里就是 ngAfterViewChecked 调用的地方

从顺序和结构上来说:

  • ngOnInit 适合初始化本组件需要的内容
  • ngAfterContentInit 适合初始化对 投射内容 具有依赖性的内容

这里同样可以查看一下生命周期调用时的输出结果,用的是前篇笔记的内容,不过只留下了 server-component 中的 ngOnInitngAfterContentInit

[Angular 基础] - 生命周期函数,# Angular,angular.js,javascript,前端

可以看到,在 ngOnInit 调用的时候,@ContentChild('contentParagraph', { static: true }) paragraph: ElementRef; 这个内容是还没有投射的,因此输出 this.paragraph.nativeElement.textContent 就是一个空的字符串

ngAfterContentInit 运行时,也就是投射的内容已经初始化后,Angular 就可以获得 this.paragraph.nativeElement.textContent 中的内容了

ngAfterContentChecked

这个生命周期函数会在每次 Angular 检查投射的内容时被调用,基本上是跟着 ngDoCheck 被调用的

ngAfterViewInit

这个生命周期函数检查的就是 V 层(包括父子组件)是否都被初始化了

这个函数也是让当前 VM 层可以访问其他 V 层

ngAfterViewChecked

同理,这个生命周期函数检查的就是 V 层(包括父子组件)是否都被 check 了

ngOnDestroy

这里就是一个清理副作用的地方,在运行这个函数后,当前的 Angular 组件就会被毁灭了文章来源地址https://www.toymoban.com/news/detail-828160.html

到了这里,关于[Angular 基础] - 生命周期函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Angular组件生命周期详解

    当 Angular 实例化组件类 并渲染组件视图及其子视图时,组件实例的生命周期就开始了。生命周期一直伴随着变更检测,Angular 会检查数据绑定属性何时发生变化,并按需更新视图和组件实例。当 Angular 销毁组件实例并从 DOM 中移除它渲染的模板时,生命周期就结束了。当 Ang

    2024年02月05日
    浏览(34)
  • react17:生命周期函数

    挂载时 更新时 setState触发更新、父组件重新渲染时触发更新 forceUpdate触发更新 卸载时 react(v17.0.2)的生命周期图谱如下。  相较于16版本,17版本生命周期函数有如下变化: componentWillMount() componentWillUpdate() componentWillReceiveProps() +getDerivedStateFromProps(props,state) +getSnapshotBeforeUp

    2024年02月11日
    浏览(37)
  • Vue生命周期函数(详解)

    目录  生命周期图 生命周期函数 beforeCreate和created的区别 beforeCreate创建前应用场景  created创建后应用场景 beforeMount和mounted的区别  beforeMount挂载前应用场景  mounted挂载后应用场景  beforeUpdate和updated的区别  beforeUpdate更新前应用场景  updated更新后应用场景  beforeDestroy和des

    2024年02月13日
    浏览(38)
  • Angular 学习日记 - 7 - 生命周期

     建议在实现Angular  生命周期(LifeCycle Hooks) 时,可以写在类实现的后面,既可以方便他人知晓用了哪些生命周期方法,又可以用vscode自动补全来生成该方法,还可以防止拼错方法名 (指我自己) 。 1、ngOnInit() 在构造函数触发后触发   2、ngOnChanges() 触发时会自动传入一个

    2024年02月04日
    浏览(37)
  • 生命周期函数和wxs脚本

    应用的生命周期函数:指小程序从启动 - 运行 - 销毁期间依次调用的那些函数。 小程序的应用生命周期函数需要在 app.js 中进行声明。 上面这张图就是从前台进入了后台。后台进入前台反之同理。 页面的生命周期函数:指小程序中,每个页面从加载 - 渲染 - 销毁期间依次调

    2024年02月16日
    浏览(30)
  • 【Unity函数执行顺序(Unity脚本生命周期函数)】

    温故而知新,下面我将介绍Unity入门需要了解的常用生命周期函数 生命周期函数就是该脚本对象依附的GameObject对象从出生到消亡整个生命周期中 会通过反射自动调用的一些特殊函数。 下面是对各个函数解锁 a.调用情况: 1.在加载场景时初始化包含脚本激活状态的GameObject时。

    2023年04月23日
    浏览(41)
  • Angular系列教程之生命周期钩子

    Angular是一种流行的前端开发框架,它提供了许多功能强大且易于使用的工具和特性。其中之一就是生命周期钩子(Lifecycle Hooks),它们允许我们在组件的不同生命周期阶段执行自定义代码。本文将介绍Angular的生命周期钩子以及如何使用它们。 生命周期钩子是一些用于在组件

    2024年01月17日
    浏览(34)
  • vue3-生命周期钩子函数

    声明周期函数onMounted ,onUnmounted,onUpdated onMounted:页面渲染之前执行,执行完,页面就出来了 onUnmounted:组件注销之前执行,执行完组件就不在页面显示了。如果隐藏组件就行执行。 onUpdated:当组件内的内容发生变化时,就会执行这个更新钩子函数,比如删除数组中的某个元素

    2024年02月11日
    浏览(37)
  • 【react】react生命周期钩子函数:

    一、生命周期概念: 生命周期:简单来说就是一个事物从出生到消亡的过程就是生命周期,在React中的生命周期,就是组件从创建、挂载到页面再到卸载组件的过程。 意义:生命周期有助于理解组件运行方式、完成复杂组件功能、分析组件中间问题产生的原因等。 生命周期钩子函数

    2024年02月14日
    浏览(39)
  • Unity 关于生命周期函数的一些认识

    Unity 生命周期函数主要有以下一些: Awake() : 在脚本被加载时调用。用于初始化对象的状态和引用。 OnEnable() : 在脚本组件被启用时调用。在脚本组件被激活时执行一次,以及在脚本组件被重新激活时执行。 Reset() : 在脚本组件被重置时调用。用于重置脚本的初始状态。 Start

    2024年01月21日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包