Angular开发技巧

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

工具篇

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

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

222.png

快速打开最近文档:前进 Ctrl+➕  后退 Ctrl+➖

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

333.png

安装插件 Angular Extension Pack (认准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)

e5dc25f8-a0ec-4706-919a-aa19194a7017.png

还有很多其他功能,插件中有详细介绍 [`Angular Extension Pack](https://marketplace.visualstudio.com/items?itemName=doggy8088.angular-extension-pack)

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

111.png

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

安装插件 Prettier - Code formatter,这是一个代码格式化的插件,用过几个格式化的插件,个人感觉较好用的一个,更适合Angular开发

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

444.png
555.png

开发篇

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

使用模板语言 as , 使用 as 对一些嵌套结构深的属性进行重命名
改进前:

<div *ngFor="let queue of fileUploadQueues">
    <div class="icon" *ngIf="queue.result.file.icon">{{ queue.result.file.icon }}</div>
    <div class="name" *ngIf="queue.result.file.name">{{ queue.result.file.name }}</div>
    <div class="size" *ngIf="queue.result.file.size">{{ queue.result.file.size }}</div>
</div>

改进后:

<div *ngFor="let queue of fileUploadQueues">
  <ng-container *ngIf="queue.result.file as file">
       <div class="icon" *ngIf="file.icon">{{ file.icon }}</div>
       <div class="name" *ngIf="file.name">{{ file.name }}</div>
       <div class="size" *ngIf="file.size">{{ file.size }}</div>
  </ng-container>
</div>

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

改进前:

<div *ngIf="(data$ | async).length > 0">
   ...
</div>
<div *ngIf="!(data$ | async).length > 0">
   没有数据
</div>

改进后:

<div *ngIf="(data$ | async).length > 0; else emptyTemplate;">
   ...
</div>
<ng-template  #emptyTemplate>
   没有数据
</ng-template>

改进前的写法,也能实现同样的效果,但是因为数据是通过async 订阅的,名列前茅种写法相当于进行了两次订阅,当然也可以用 as 来解决,这里只是一个示例。
还有一种情况,在条件多的时候,通过名列前茅种方式写的话,如果条件有修改的话,必须要对取反后的条件进行维护, 而用 ngIfElse 的方式则只需要进行一次维护。

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

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

@ViewChild 读取指定类型的实例

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

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

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

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

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

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

<div *ngFor="let item of data$ | async as data">
   <span>一共有{{data.length}}条数据</span>
</div>

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

private _ngUnsubscribe$ = new Subject();

ngOnInit() {
 this.students$.pipe(
    takeUntil(_ngUnsubscribe$)
 ).subscribe(() => {
         ...
 });
 this.books$.pipe(
    takeUntil(_ngUnsubscribe$)
 ).subscribe(() => {
         ...
 });
}
ngOnDestroy() {
  this._ngUnsubscribe$.next();
  this._ngUnsubscribe$.complete();
}

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

this.ngZone.runOutsideAngular(() => {
   this.renderer.listen(this.elementRef.nativeElement, 'keydown', event => {
      const keyCode = event.which || event.keyCode;
         if (keyCode === keycodes.ENTER) {
              event.preventDefault();
              this.ngZone.run(() => {
                  this.thyEnter.emit(event);
              });
         }
   });
});

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

灵活使用 ngTemplateOutlet 来实现递归

<ng-container *ngFor="let node of treeNodes;" [ngTemplateOutlet]="nodeTemplate" 
         [ngTemplateOutletContext]="{node: node}">
</ng-container>

<ng-template #nodeTemplate let-node="node">
     <div class='title'>{{node.title}}</div>
      <ng-container *ngFor="let child of node?.children;"  [ngTemplateOutlet]="nodeTemplate"
                     [ngTemplateOutletContext]="{node: child}">
       </ng-container>
</ng-template>

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

写在最后

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

文章标题:Angular开发技巧,发布者:刘佳,转载请注明出处:https://worktile.com/kb/p/6530

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
刘佳刘佳认证作者
上一篇 2022年3月20日 上午1:29
下一篇 2022年3月20日 上午1:33

相关推荐

  • 团队管理系统可以设置哪些状态

    团队管理系统可以设置的状态有:一、 任务状态;二、项目状态;三、团队状态;四、优先级状态。在团队管理系统中,任务状态是最基本的状态之一。它可以用来标识任务的不同阶段,以便团队成员更好地了解任务的进展情况。 一、 任务状态 在团队管理系统中,任务状态是最基本的状态之一。它可以用来标识任务的不同阶段,以…

    2023年4月24日
    49100
  • 知识库是什么

    知识库是知识工程中结构化,易操作,易利用,全面有组织的知识集群,是针对某一(或某些)领域问题求解的需要,采用某种(或若干)知识表示方式在计算机存储器中存储、组织、管理和使用的互相联系的知识片集合。 知识库是知识工程中结构化,易操作,易利用,全面有组织的知识集群,是针对某一(或某些)领域问题求解的需要…

    2022年11月16日
    1.7K00
  • 多个项目看板怎么设计

    多个项目看板的设计方法:1、统一看板;2、分组看板;3、卡片看板;4、大屏看板。统一看板是指把所有项目的主要信息集中在一个看板上展示每个项目的重要数据、进度等;分组看板是指将关联性较强的项目放在一个组进行监控。 一、多个项目看板的设计方法 1、统一看板 统一看板是指把所有项目的主要信息集中在一个看板…

    2023年4月8日
    69200
  • 办公室自动化oa是什么

    自动化办公系统(Office Automation System,简称OA)是一套帮助个人、团队和企业在日常工作中提高效率和管理水平的软件和系统。主要实现资料处理、通信联络和个人管理等功能,1. 资料自动化处理、2. 高效通信联络、3. 强化个人管理。资料自动化处理能够提高文档管理的效率,确保信息存…

    2024年1月11日
    25100
  • 为什么使用规则引擎

    规则引擎可以简化业务架构,让开发人员更容易理解业务逻辑,并在一个开发环境中提供一致易用的工具。降低开发人员使用复杂代码的难度;降低数据录入工作量;优化功能代码实现,提高开发效率;灵活扩展应用程序功能,快速上线新功能;增加应用程序的灵活性。 一、什么是规则引擎 定义:是指对业务系统的规则进行抽象,使之…

    2023年7月28日
    61300
  • 技术研发怎么管理

    技术研发管理涵盖项目的策划、团队协作、资源配置和进度监控等关键要素,目标在于有效推动技术创新,并确保研发项目的顺利完成。1、建立有效沟通机制;2、制定明确目标与里程碑;3、采用敏捷开发方法;4、强化项目监控与风险管理;5、培养跨领域合作团队。 其中,敏捷开发方法以其灵活性和适应性,正成为众多组织管理…

    2024年1月9日
    22700
  • 数据分析中的相关性分析是什么

    相关性分析是数据分析中的重要手段,它用于研究两个或多个变量之间的相互关系的强度和方向。在相关性分析中,主要的核心指标包括1、皮尔逊相关系数,2、斯皮尔曼等级相关系数,3、肯德尔等级相关系数。为了深入理解相关性分析,本文将从皮尔逊系数的计算和应用、非参数相关性分析和相关性的限制三个方面展开。对于每一指…

    2023年11月21日
    79800
  • 回调函数,仿函数(functor)的区别及各自应用场景

    区别:回调函数是一个被作为参数传递的函数。在C语言中,回调函数只能用函数指针实现,在C++、Python、ECMAScript中还能使用仿函数或匿名函数。仿函数(functor),就是使一个类的使用看上去像一个函数。其实现是类中实现一个operator(),这个类有了类似函数的行为,就是一个仿函数类…

    2023年2月20日
    56300
  • oa系统哪家做得好

    标题:OA系统开发公司排名分析 摘要:在现代企业管理中,OA(办公自动化)系统发挥着举足轻重的角色。评选出一流的OA系统供应商关键在于其系统功能的全面性、用户体验的友好性、定制能力及售后服务水平。《福布斯》杂志公布的排名显示,1、微软因其Office 365套件而遥遥领先;2、谷歌凭借G Suite…

    2024年1月11日
    29100
  • 测试文档怎么写

    测试文档包括:1、测试策略;2、测试计划和估算;3、测试场景;4、测试用例;5、测试数据;6、需求可追溯性矩阵;7、测试摘要报告;8、测试收敛报告;9、事件报告。测试策略是由测试经理开发的基本高级管理文档,它概述了软件开发周期的方法。 一、测试文档内容 1、测试策略 根据业务需求规范选择测试策略,它…

    2023年3月31日
    1.6K00

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部