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

工具篇

所谓 “工欲善其事,必先利其器”,下面我会介绍 如何打磨 `VS Code` 这把利器
  1. 抛弃 资源管理器  ,使用快捷键  Commd + P  来查找文档,默认会展示最近打开的文档,并且支持模糊搜索文件

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

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

  4. 安装插件  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)

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

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

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

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

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

开发篇

下面会介绍一些Angular开发中的技巧
  1. 使用模板语言  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>
  2. 灵活使用  *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  的方式则只需要进行一次维护。

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

    <ng-container *ngIf="type === 1">
    ...
    </ng-container>
    <ng-container *ngIf="type === 2">
    ...
    </ng-container>
    <ng-container *ngIf="type === 3">
    ...
    </ng-container>
  4. @ViewChild  读取指定类型的实例

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

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

    @ViewChild('input', { read:ThyInputComponent })  inputComponent : ThyInputComponent ;
    
  5. 使用  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>
  6. 使用  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();
    }
  7. 合理使用 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()  主动触发变化检测

  8. 灵活使用  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学习者提供帮助~

Worktile官网:www.worktile.com

本文作者:王凯

文章首发于「Worktile官方博客」,转载请注明来源。

Angular开发技巧的更多相关文章

  1. AngularJS进阶(三十一)AngularJS项目开发技巧之获取模态对话框中的组件ID

    AngularJS项目开发技巧之获取模态对话框中的组件ID 需求 出于项目开发需求,需要实现的业务逻辑是:药店端点击查看"已发货""已收货"订单详情时,模块弹出 ...

  2. SQL开发技巧(二)

    本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...

  3. DelphiXE2 DataSnap开发技巧收集

    DelphiXE2 DataSnap开发技巧收集 作者:  2012-08-07 09:12:52     分类:Delphi     标签: 作为DelphiXE2 DataSnap开发的私家锦囊, ...

  4. delphi XE5下安卓开发技巧

    delphi XE5下安卓开发技巧 一.手机快捷方式显示中文名称 project->options->Version Info-label(改成需要显示的中文名即可),但是需要安装到安卓手 ...

  5. 经典收藏 50个jQuery Mobile开发技巧集萃

    http://www.cnblogs.com/chu888chu888/archive/2011/11/10/2244181.html 1.Backbone移动实例 这是在Safari中运行的一款Ba ...

  6. 移动 Web 开发技巧之(后续)

    昨天的<移动 Web 开发技巧>的这篇文章,大家反响不错,因为这些问题在大家日常写移动端的页面时经常遇到的.所以那个文章还是超级实用的,那么我们今天继续来分享一下移动端的web开发技巧吧, ...

  7. Maven 安装以及一些开发技巧

    解压 apache-maven-3.2.5 在conf ->sites中配置repository 的路径. Eclipse 配置 maven 2. 3. 一些小BUG 或开发技巧 eclipse ...

  8. thinkphp开发技巧经验分享

    thinkphp开发技巧经验分享 www.111cn.net 编辑:flyfox 来源:转载 这里我给大家总结一个朋友学习thinkphp时的一些笔记了,从变量到内置模板引擎及系统变量等等的笔记了,同 ...

  9. Java 8的五大开发技巧

    转载:http://geek.csdn.net/news/detail/94219 在Java 9发布之前,我们来分享一些Java 8开发技巧,本文翻译自JetBrains高级开发主管Trisha G ...

随机推荐

  1. 【BZOJ 1002】: [FJOI2007]轮状病毒

    题目大意:(略) 题解: 第一眼,这不是矩阵树裸体,看了看样例,心想3就有16,那100岂不是要上天…… 果然炸long long……emmmm该不会要打高精除吧……害怕,按照老师的话,不可能考高精除 ...

  2. LuoguP4234_最小差值生成树_LCT

    LuoguP4234_最小差值生成树_LCT 题意: 给出一个无向图,求最大的边权减最小的边权最小的一棵生成树. 分析: 可以把边权从大到小排序,然后类似魔法森林那样插入. 如果两点不连通,直接连上, ...

  3. BZOJ3613: [Heoi2014]南园满地堆轻絮

    分析: 构造数据时间有些长,可以用秦九韶优化一下. 二分答案+贪心,即:另每一个b[i]尽可能的小的同时满足题意,在枚举过程中,判断是否存在一个b[i-1]>a[i]+x 如果存在,那么向右找 ...

  4. Rmq Problem/mex BZOJ3339 BZOJ3585

    分析: 一开始没看懂题... 后来想用二分答案却不会验证... 之后,想到用主席树来维护... 建一个权值线段树,维护出这个权值以前所有的点最晚在哪里出现... 之后,查一下是不是比查询区间的l断点大 ...

  5. UWP中实现大爆炸效果(二)

    上一回实现了一个宽度不均匀的Panel,这次我们编写一个简单的BigbangView主体. 首先创建一个模板化控件,删掉Themes/Generic.xaml中的<Style TargetTyp ...

  6. 客户端热更新框架之UI热更框架设计(上)

    什么是热更新,为什么需要热更新?          热更新是目前各大手游等众多App常用的更新方式.简单来说就是在用户通过App Store下载App之后,打开App时遇到的即时更新.对于手游客户端来 ...

  7. 阿里微服务架构下分布式事务解决方案-GTS

    虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段.即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例.GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题的中间件 ...

  8. requests使用“proxy”代理访问接口

    在requests中使用proxy代理访问 使用前先更新requests版本为支持socks的版本.   先pip安装对应库:  >> pip install -U requests[so ...

  9. Python 转化成 PB 格式数据

    一.概述 Protocol Buffers 是 Google 公司开发的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯 ...

  10. .NETCore 快速开发做一个简易商城

    介绍 上一篇介绍 <.NETCore 基于 dbfirst 体验快速开发项目>,讲得不太清楚有些多人没看懂.这次吸取教训,将一个简易商城做为案例,现实快速开发. 本案例用于演示或学习,不具 ...