常用的Angular 生命周期钩子
Angular从程序引导启动、再到创建、销毁,组件动作都有一系列钩子事件,
可以在相应的钩子里,做对应的业务逻辑
ngOnChanges() 属性变更通知
当所有绑定属性的值发生变化结束后触发, 不常用
ngOnInit() 组件初始化
组件初始化完成后,数据变更检测前触发。
此时组件的模板 template 值已经写入DOM树当中,在这里适合做数据请求与处理
ngDoCheck() 变更检测
不管是否有数据,到了改检测的周期时,变会触发,这是一个高频率触发,不适宜做处理
ngAfterContentInit()
官方定义: 当 Angular 把外部内容投影进组件视图之后调用。
Respond after Angular projects external content into the component’s view.
ngAfterViewInit()
官方定义: 会在 Angular 完全初始化组件视图及其子视图后调用。
A lifecycle hook that is called after Angular has fully initialized a component’s view.
@ViewChild() 和 @ContentChild()
@ViewChild 用来获取当前模板中出现的组件对象
@ContentChild 用来获取当前模板的<ng-content></ng-content>里面出现的组件对象
eg.
例如 假设最外容器为user-list
@Viewchild用法如下:
1 |
|
@ContentChild用法如下
1 |
|
首先,user-deatil 内部必须包含 <ng-content></ng-content> ,
才能显示 <h2>订单列表</h2><user-trade></user-trade> 内容。
其次,通过 @ContentChild() 来获取<ng-content></ng-content>里面内容的组件。
tips
- 在组件标签的内部,不要放任何内容 —— 除非想把这些内容投影进这个组件中。
<ng-content>标签是外来内容的占位符。 它告诉 Angular 在哪里插入这些外来内容
总结
AfterContent 钩子优先于 AfterView 钩子。
因为在组件遇到 ng-content 时,需要先处理完,才会继续后面的部分。
AfterView 钩子所关心的是 ViewChildren,这些子组件的元素标签,会直接出现在该组件的模板里面。
AfterContent 钩子所关心的是 ContentChildren,这些子组件被 Angular 投影进该组件中。
ngOnDestroy() 销毁
组件销毁之前触发。
会做一些unsubscribe。来避免页面销毁后,仍有订阅接收,造成内存占用过大。
angular2+ 的 DI (dependency inject)
依赖注入是angular的一种设计模式。
angular 为了解决数据共享和逻辑复用,引入了服务(service)
(一般,在service只做与视图无关的逻辑,比如从服务器拉取数据、验证客户输入等)
service就是提供一些特殊功能的class,应用程序中各种组件和指令都有可能需要这个服务提供的功能。
通过angular的依赖注入,这些具有特殊功能的服务可以被任何组件注入并使用。
只需要构建依赖关系,告诉angular这里依赖serviceA,不需要通过new来实例化,也不需要关心服务中的constructor需要传递什么参数。在providers注入之后,所有组件都可在构造函数中注入这个服务,并且所有组件用的是同一个实例,数据共享,这个特性可以用来在组件之间传值。
- 本文作者:JSZ
- 本文链接:blog.vampuck.com/2022/06/16/ng_lifecycle_hook/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!