constructor和ngOnInit差异及适用场景
首先,贴上解决我疑惑的博主的帖子链接,此处内容也参考该文 https://blog.youkuaiyun.com/u010730126/article/details/64486997
Angular中存在生命周期钩子方法ngOnInit。但在TypeScript或ES6中还存在着名为constructor的构造函数,开发过程中经常会混淆二者,毕竟它们的含义有某些重复部分,那ngOnInit和constructor之间有什么区别呢?它们各自的适用场景又是什么呢?
区别
1.constructor
constructor是ES6引入类的概念后新出现的东西,是类的自身属性,并不属于Angular的范畴,所以Angular没有办法控制constructor。constructor会在类生成实例时调用:
import {Component} from '@angular/core';
@Component({
selector: 'hello-world',
templateUrl: 'hello-world.html'
})
class HelloWorld {
constructor() {
console.log('constructor被调用,但和Angular无关');
}
}
// 生成类实例,此时会调用
constructor new HelloWorld();
既然Angular无法控制constructor,那么ngOnInit的出现就不足为奇了。
2.ngOnInit
ngOnInit的作用根据官方的说法:
在 Angular 第一次显示数据绑定和设置指令/组件的输入属性之后,初始化指令/组件。
在第一轮 ngOnChanges() 完成之后调用,只调用一次。
import {Component, OnInit} from '@angular/core';
@Component({
selector: 'hello-world',
templateUrl: 'hello-world.html'
})
class HelloWorld implements OnInit {
constructor() { }
ngOnInit() {
console.log('ngOnInit被Angular调用');
}
}
适用场景
1.constructor
其主要作用是注入依赖,特别是在TypeScript开发Angular工程时,经常会遇到类似下面的代码:
import { Component, ElementRef } from '@angular/core';
@Component({
selector: 'hello-world',
templateUrl: 'hello-world.html'
})
class HelloWorld {
constructor(private elementRef: ElementRef) {
// 在类中就可以使用this.elementRef了
}
}
在constructor中注入的依赖,就可以作为类的属性被使用了。
2.ngOnInit
纯粹是通知开发者组件/指令已经被初始化完成了,此时组件/指令上的属性绑定操作以及输入操作已经完成,也就是说在ngOnInit函数中我们已经能够操作组件/指令中被传入的数据了:
// hello-world.ts
import { Component, Input, OnInit } from '@angular/core';
@Component({
selector: 'hello-world',
template: `<p>Hello {{name}}!</p>`
})
class HelloWorld implements OnInit {
@Input()
name: string;
constructor() {
// constructor中还不能获取到组件/指令中被传入的数据
console.log(this.name); // undefined
}
ngOnInit() {
// ngOnInit中已经能够获取到组件/指令中被传入的数据
console.log(this.name); // 传入的数据
}
}
所以我们可以在ngOnInit中做一些初始化操作。
总结
开发中我们经常在ngOnInit做一些初始化的工作,而这些工作尽量要避免在constructor中进行,constructor中应该只进行依赖注入而不是进行真正的业务操作。
package.json中的dependencies和devDependencies的区别
首先需要说明的是Dependencies一词的中文意思是依赖和附属的意思,而dev则是develop(开发)的简写。
(一)dependencies
(1)内容:是一个对象,配置模块依赖的模块列表,key是模块名称,value是版本范围
(2)作用:该模块中所列举的插件属于生产环境的依赖(程序正常运行需要加载的依赖)
(3)部署来源:通过你npm install进行依赖安装时加上-save
(二)devDependencies
(1)内容:是一个对象,配置模块依赖的模块列表,key是模块名称,value是版本范围
(2)作用:该模块中所列举的插件属于开发环境的依赖(比如:测试或者文档框架等)
(3)部署来源:通过你npm install进行依赖安装时加上-save-dev
区别
devDependencies是只会在开发环境下依赖的模块,生产环境不会被打入包内。而dependencies依赖的包不仅开发环境能使用,生产环境也能使用。
比如我们写一个项目要依赖于jQuery,没有这个包的依赖运行就会报错,这时候就把这个依赖写入dependencies;
而我们使用的一些构建工具比如glup、webpack这些只是在开发中使用的包,上线以后就和他们没关系了,所以将它写入devDependencies。
安装依赖
(1)如果拿到别人的项目,需要安装之前package.json中devdependencies 和 dependencies两个模块下所列举的依赖,可以通过执行以下命令实现
npm install
(2)如果拿到别人的项目,只需要安装之前package.json中dependencies 模块下所列举的依赖,可以通过执行以下命令实现
npm install packagename
(3)如果拿到别人的项目,只需要安装之前package.json中devdependencies 模块下所列举的依赖,可以通过执行以下命令实现
npm install packagename -dev
删除依赖
(1)npm uninstall “依赖名称”:删除依赖,但不会删除package.json的配置(即通过npm install依然可以安装该依赖),例如
npm uninstall echarts
(2)npm uninstall “依赖名称” --save-dev:删除依赖,同时删除package.json中devdependencies 的配置,例如
npm uninstall echarts --save-dev
(3)npm uninstall “依赖名称” --save:删除依赖,同时删除package.json中dependencies 的配置,例如
npm uninstall echarts --save