Angular 开发技巧

Stella981
• 阅读 592

Angular 开发技巧

由于之前有幸去参加了 ngChina 2018 开发者大会,听了 will 保哥分享了 Angular 开发技巧,自己接触 Angular 也有差不多快一年的时间了,所以打算对 Angular 开发中的一些技巧做一个整理。

工具篇

所谓 “工欲善其事,必先利其器”,下面我会介绍 如何打磨 VS Code 这把利器。

1、抛弃”资源管理器“ ,使用快捷键 Commd+P 来查找文档,默认会展示最近打开的文档,并且支持模糊搜索文件。

Angular 开发技巧

2、快速打开最近文档:前进 Ctrl+ 后退 Ctrl-

3、灵活使用 VS Code 重构功能,可以通过快捷键 Command+ 对代码进行重构。

Angular 开发技巧

4、安装插件 AngularExtensionPack (认准will保哥出品),这个插件集成了很多提升 Angular 开发效率的插件。比如:

  • 在 TS 中使用 ng-import-* 导入常见的类。

  • 模板编辑的时候实用 a-*** 快速使用 Angular 的组件和指令(Angular v7 Snippets)。

  • 使用 ng-* 来生成常用的ng代码段,创建 Component、Directive(Angular Snippets)等。

  • 通过快捷键把 JSON 转换成 TS 类。

  • Ctrl+Alt+V 把粘贴板中的 JSON 转为 Typescript。

  • Ctrl+Alt+S 将选中的 JSON 生成对应的 Typescript,

还有一个值得一提的一个比较实用的功能,通过快捷键来 快速切换组件对应的不同的文件(Angular2-switcher):

Angular 开发技巧

还有很多其他功能,插件中有详细介绍:`Angular Extension Pack。

5、安装插件 ClipboardHistory,这个插件会存储你最近的拷贝的记录,方便记录和粘贴最近几次的拷贝内容。

Angular 开发技巧

6、安装插件 LocalHistory ,这个插件用于维护文件的本地历史记录。每次修改文件时,旧内容的副本都会保留在本地历史记录中,你可以随时将文件与历史记录中的任何旧版本进行比较,如果发生意外时,可以帮助我们恢复丢失的内容,需要注意的是它会生成一个 .history 的文件夹进行本地修改的备份,所以我们需要再 .gitignore 排除这个文件夹,避免将其提交到 git 仓储。

7、安装插件 Prettier-Codeformatter,这是一个代码格式化的插件,用过几个格式化的插件,个人感觉最好用的一个,更适合 Angular 开发。

8、安装 Chrome 插件 AngularAngury 进行调试工作,可以查看 Component 的 State、Router Tree、NgModules 的一些状态 (这个插件在复杂项目中并不是特别好用,包括对一些动态组件的支持比较差,但是在一些简单的项目中,或者新手在学习的时候安装这个插件比较方便调试排错)。

Angular 开发技巧

Angular 开发技巧

开发篇

下面会介绍一些 Angular 开发中的技巧。

1、使用模板语言 as 对一些嵌套结构深的属性进行重命名。

改进前:

  1. <div *ngFor="let queue of fileUploadQueues">

  2. <div class="icon" *ngIf="queue.result.file.icon">{{ queue.result.file.icon }}</div>

  3. <div class="name" *ngIf="queue.result.file.name">{{ queue.result.file.name }}</div>

  4. <div class="size" *ngIf="queue.result.file.size">{{ queue.result.file.size }}</div>

  5. </div>

改进后:

  1. <div *ngFor="let queue of fileUploadQueues">

  2. <ng-container *ngIf="queue.result.file as file">

  3. <div class="icon" *ngIf="file.icon">{{ file.icon }}</div>

  4. <div class="name" *ngIf="file.name">{{ file.name }}</div>

  5. <div class="size" *ngIf="file.size">{{ file.size }}</div>

  6. </ng-container>

  7. </div>

2、灵活使用 *ngIfElse。很多人其实一直在写 *ngIf,并不知道其实 Angular 支持 else 的写法: *ngIf="条件; else 模板",看看下面这两段代码:

改进前:

  1. <div *ngIf="(data$ | async).length > 0">

  2. ...

  3. </div>

  4. <div *ngIf="!(data$ | async).length > 0">

  5. 没有数据

  6. </div>

改进后:

  1. <div *ngIf="(data$ | async).length > 0; else emptyTemplate;">

  2. ...

  3. </div>

  4. <ng-template #emptyTemplate>

  5. 没有数据

  6. </ng-template>

改进前的写法,也能实现同样的效果,但是因为数据是通过 async 订阅的,第一种写法相当于进行了两次订阅,当然也可以用 as 来解决,这里只是一个示例。

还有一种情况,在条件多的时候,通过第一种方式写的话,如果条件有修改的话,必须要对取反后的条件进行维护, 而用 ngIfElse 的方式则只需要进行一次维护。

3、使用 ng-container 对代码进行整理,使代码更清晰,提升代码的可读性。

  1. <ng-container *ngIf="type === 1">

  2. ...

  3. </ng-container>

  4. <ng-container *ngIf="type === 2">

  5. ...

  6. </ng-container>

  7. <ng-container *ngIf="type === 3">

  8. ...

  9. </ng-container>

4、 @ViewChild 读取指定类型的实例。

  1. <input #input thyInput [thyAutofocus]="true" />

上面这行代码有三个实例 ElementRefThyInputComponentThyAutoFocusDirective,在某些情况下如果我们要获取指定类型的实例应该怎么做呢?

  1. @ViewChild('input', { read:ThyInputComponent }) inputComponent : ThyInputComponent;

5、使用 async 管道,直接在模板中订阅流,而不必将结果存储在中间属性中,当组件被销毁时,Angular 将会自动取消订阅。

  1. <div *ngFor="let item of data$ | async">

  2. ...

  3. </div>

在一些情况下,我们可能需要重复使用订阅的数据,但是我们又不能每次使用的时候都用 async去订阅,所以我们可以通过刚才说的 as 对齐进行重命名。

  1. <div *ngFor="let item of data$ | async as data">

  2. <span>一共有{{data.length}}条数据</span>

  3. </div>

6、使用 takeUntil 来管理订阅

在某些复杂的业务中,我们可能需要订阅多个流,一个一个去取消订阅又繁琐,又会产生很多冗余代码,不利于代码的维护。这时候我们可以 takeUntil 来管理多个订阅,统一取消订阅。

  1. private _ngUnsubscribe$ = new Subject();

  2. ngOnInit() {

  3. this.students$.pipe(

  4. takeUntil(_ngUnsubscribe$)

  5. ).subscribe(() => {

  6. ...

  7. });

  8. this.books$.pipe(

  9. takeUntil(_ngUnsubscribe$)

  10. ).subscribe(() => {

  11. ...

  12. });

  13. }

  14. ngOnDestroy() {

  15. this._ngUnsubscribe$.next();

  16. this._ngUnsubscribe$.complete();

  17. }

7、合理使用 ngZone runOutsideAngular 来提升应用性能

我们知道 Angular 可以自动处理变化检测,这是因为它使用了 zone.js。简单的来说, zone.js就是通过打补丁的方式来拦截浏览器的事件,然后进行变化检测,但是变化检测是极其消耗资源的,如果绑定了大量的事件,那么就会造成性能问题,所以我们可以使用 runOutsideAngular 来减少不必要的变化检测。

  1. this.ngZone.runOutsideAngular(() => {

  2. this.renderer.listen(this.elementRef.nativeElement, 'keydown', event => {

  3. const keyCode = event.which || event.keyCode;

  4. if (keyCode === keycodes.ENTER) {

  5. event.preventDefault();

  6. this.ngZone.run(() => {

  7. this.thyEnter.emit(event);

  8. });

  9. }

  10. });

  11. });

上面这段代码是绑定一个回车事件,如果不使用 runOutsideAngular 的话,只要触发键盘输入事件,就会执行变化检测,这时候我们可以用 runOutsideAngular 在只有为enter 事件的时候,去调用 ngZone.run() 主动触发变化检测。

8、灵活使用 ngTemplateOutlet 来实现递归。

  1. <ng-container *ngFor="let node of treeNodes;" [ngTemplateOutlet]="nodeTemplate"

  2. [ngTemplateOutletContext]="{node: node}">

  3. </ng-container>

  4. <ng-template #nodeTemplate let-node="node">

  5. <div class='title'>{{node.title}}</div>

  6. <ng-container *ngFor="let child of node?.children;" [ngTemplateOutlet]="nodeTemplate"

  7. [ngTemplateOutletContext]="{node: child}">

  8. </ng-container>

  9. </ng-template>

在我们实际开发的过程中,经常会展示一些树形结构的数据,如果业务场景比较简单,可以通过 Angular 的 ngTemplateOutlet 来实现递归展示,如果业务复杂,建议还是通过组件的方式来实现。

写在最后

上面是我这一年 Angular 开发的过程中积累的一些小技巧(可能还有没想起来的,我想起来会慢慢的往上补),大家如果发现有错误的地方,请指正。其实去年就写好这篇文章,但是总感觉缺点什么,不过无所谓了。希望能给 Angular 学习者提供帮助~

源自:https://segmentfault.com/a/1190000018421409

声明:文章著作权归作者所有,如有侵权,请联系小编删除。

感谢 · 转发欢迎大家留言

Angular 开发技巧

Angular 开发技巧

点1个 “

” 少 n个 bug

本文分享自微信公众号 - web前端学习圈(web-xxq)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Angular 1 深度解析:组件化编程
angular1也要面向组件编程前端组件化是前端开发模式中一个不可逆转的趋势,三大主要前端框架angular2reactvue都不约而同的把组件化编程作为自己的一大卖点,angular1作为一个历史相对悠久的框架,在私生子angular2的推动下,终于也搭上了组件化编程的末
Stella981 Stella981
2年前
Angular相关内容学习总结
一、angular项目搭建1、前端框架Yeoman(http://my.oschina.net/u/1416844/blog/196199) http://my.oschina.net/u/1416844/blog/196199二、angular结构划分angular经典的架构和目
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这