Angular 18+ 高级教程 – Naming Conversion
前言
命名规范对项目维护是很重要的. Angular 对项目的渗透很大的, 必须做好命名规范, 不然会很乱.
InjectionToken
InjectionToken = UPPER_SNAKE_CARE
const SERVICE_CONFIG = new InjectionToken('ServiceConfig');
variable name 用 UPPER_SNAKE_CARE
InjectionToken 的参数用 PascalCase 或者 UPPER_SNAKE_CARE



Attribute and Property
element attribute and property name = camelCase
angular.io example 有 camelCase 和 kebab-case,不过我看绝大部分都是用 camelCase 居多。
<bank-account bankName="RBC" account-id="4747"></bank-account>
Event
event handler method
如果没有一个具体的执行名字,请不要放 (click)="onClick()" 放 "handleClick()"。

ValidationErrors
ValidationErrors key 用 camelCase
from Angular Docs

不过 built-in 的 minLength 和 maxLength 的 key 是 lowercase 'minlength' 和 'maxlength' 哦,奇葩。

Directive Selector
Angular CDK Derective selector 用 kebab-case 还是 camelCase?

CdkScrollable 指令 kebab-case 和 camelCase 都能接受。

CdkVirtualScrollableElement 指令只能接受 camelCase

CdkHeaderCell 指令只能接受 kebab-case。
显然,它们没有统一规范。不过通常 element 是用 kebab-case,attribute 用 camelCase。遇到例外比如 (th[cdk-header-cell]) 也没办法,只能 follow 它。
组件 attribute selector
通常组件是 tag,指令通常是 attribute。
<my-component myDirective></my-component>
但这也只是通常。
许多情况下组件也可能是 attrbute,这种情况下要用 kebab-case 还是 camelCase 呢?

我觉得像 Angular Material Button 这样使用 kebab-case 挺好的。
当组件的 selector 是 attribute 时使用 kebab-case。
@HostBinding and @HostListener Decorator
官网的 guide 是叫我们尽量用 @HostBinding Decorator 对比在 @Directive host property

但是 Angular Material 一直没有 follow 这个 guide

如今 Angular 正在去 Decorator 化,所以我建议使用 @Directive host property。
Animation CSS Property
依据官网教程,使用 camelCase

我觉得 camelCase 比 kebab-case 好,因为 Web Animation API 是只能使用 camelCase,这样比较统一。
Animation Trigger Name
下面这些是从 Angular Material 源码中抄出来的 Trigger Name:
- detailExpand
- panelAnimation
- state
- transformPanel
- fadeInCalendar
- dialogContainer
- indicatorRotate
- bodyExpansion
- transitionMessages
- transformMenu
- fadeInItems
- transformPanelWrap
- transformPanel
- transform
- indicator
- leftPointer
- rightPointer
- arrowOpacity
- arrowPosition
- allowChildren
- horizontalStepTransition
- verticalStepTransition
- translateTab
没有统一规范,但大部分有 2 个特性
对象
比如 panel, Calendar, dialog, body, Messages, Menu, Items 等等
有时候在前面,有时候在后面
动作
比如 Expand, transform, fadeIn, Rotate 等等
有时候在前面,有时候在后面,有时候只有对象没有动作。
当然还有一些比较直接的:panelAnimation,state。
我个人的规范是:
如果这个 trigger 会被用在多个 element 上,那取个动作名字就好了。
如果是用在指定 element 上,最好配个对象名字。
如果动作不好取,就直接叫 panelAnimation 或者 panelAnimationState 就好了。
x, y, top, right, bottom, left, vertical, horizontal
vertical 和 horizontal 的抽象叫 orientation (follow Angular Material)
x, y 抽象叫 axis (轴的意思,follow Angular Material)
top, right, bottom, left 抽象叫 position 或 direction (follow Angular Material)
exportAs
参考 Angular Material


指令和组件都可能会有 exportAs,
exportAs 用的是 camelCase,通常名字就和 element tag 或 attribute 一样。
String literal union types
参考 Angular Material 源码





各种 case styles 都有,但绝大多数是 lowercase single word。
通常这些 string literal 会被用在 property 和 class name。
property 是 camelCase,class name 是 kebab-case 所以用这 2 种 case styles 就挺安全的了。
如果遇到冲突,我们可以做一些 conversion。
像这样:

//#region combineToCamelCase
export function combineToCamelCase<T1 extends string, T2 extends string>(
v1: T1,
v2: T2,
): `${Uncapitalize<T1>}${Capitalize<T2>}`;
export function combineToCamelCase<T1 extends string, T2 extends string, T3 extends string>(
v1: T1,
v2: T2,
v3: T3,
): `${Uncapitalize<T1>}${Capitalize<T2>}${Capitalize<T3>}`;
export function combineToCamelCase<T1 extends string, T2 extends string, T3 extends string, T4 extends string>(
v1: T1,
v2: T2,
v3: T3,
v4: T4,
): `${Uncapitalize<T1>}${Capitalize<T2>}${Capitalize<T3>}${Capitalize<T4>}`;
export function combineToCamelCase(...values: string[]): string {
return values
.map((value, index) =>
index === 0
? value.substring(0, 1).toLowerCase() + value.substring(1)
: value.substring(0, 1).toUpperCase() + value.substring(1),
)
.join('');
}
//#endregion //#region combineToPascalCase
export function combineToPascalCase<T1 extends string, T2 extends string>(
v1: T1,
v2: T2,
): `${Capitalize<T1>}${Capitalize<T2>}`;
export function combineToPascalCase<T1 extends string, T2 extends string, T3 extends string>(
v1: T1,
v2: T2,
v3: T3,
): `${Capitalize<T1>}${Capitalize<T2>}${Capitalize<T3>}`;
export function combineToPascalCase<T1 extends string, T2 extends string, T3 extends string, T4 extends string>(
v1: T1,
v2: T2,
v3: T3,
v4: T4,
): `${Capitalize<T1>}${Capitalize<T2>}${Capitalize<T3>}${Capitalize<T4>}`;
export function combineToPascalCase(...values: string[]): string {
return values.map(value => value.substring(0, 1).toUpperCase() + value.substring(1)).join('');
}
//#endregion //#region combineToKebabCase
export function combineToKebabCase<T1 extends string, T2 extends string>(
v1: T1,
v2: T2,
): `${Lowercase<T1>}-${Lowercase<T2>}`;
export function combineToKebabCase<T1 extends string, T2 extends string, T3 extends string>(
v1: T1,
v2: T2,
v3: T3,
): `${Lowercase<T1>}-${Lowercase<T2>}-${Lowercase<T3>}`;
export function combineToKebabCase<T1 extends string, T2 extends string, T3 extends string, T4 extends string>(
v1: T1,
v2: T2,
v3: T3,
v4: T4,
): `${Lowercase<T1>}-${Lowercase<T2>}-${Lowercase<T3>}-${Lowercase<T4>}`;
export function combineToKebabCase(...values: string[]): string {
return values.map(value => value.toLowerCase()).join('-');
}
//#endregion
Change or Changes?
Angular Material 在写 @Output 时是用 xxxChange

但 xxxChanges 也有很多地方会使用哦





Angular 18+ 高级教程 – Naming Conversion的更多相关文章
- Siki_Unity_2-9_C#高级教程(未完)
Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ...
- Pandas之:Pandas高级教程以铁达尼号真实数据为例
Pandas之:Pandas高级教程以铁达尼号真实数据为例 目录 简介 读写文件 DF的选择 选择列数据 选择行数据 同时选择行和列 使用plots作图 使用现有的列创建新的列 进行统计 DF重组 简 ...
- ios cocopods 安装使用及高级教程
CocoaPods简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如Java语言的Maven,nodejs的npm.随着iOS开发者的增多,业界也出现了为iOS程序提供依赖管理的工具,它的 ...
- 【读书笔记】.Net并行编程高级教程(二)-- 任务并行
前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ...
- 【读书笔记】.Net并行编程高级教程--Parallel
一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ...
- 分享25个新鲜出炉的 Photoshop 高级教程
网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...
- 展讯NAND Flash高级教程【转】
转自:http://wenku.baidu.com/view/d236e6727fd5360cba1adb9e.html 展讯NAND Flash高级教程
- Net并行编程高级教程--Parallel
Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控 ...
- [转帖]tar高级教程:增量备份、定时备份、网络备份
tar高级教程:增量备份.定时备份.网络备份 作者: lesca 分类: Tutorials, Ubuntu 发布时间: 2012-03-01 11:42 ė浏览 27,065 次 61条评论 一.概 ...
- Angular CLI 使用教程指南参考
Angular CLI 使用教程指南参考 Angular CLI 现在虽然可以正常使用但仍然处于测试阶段. Angular CLI 依赖 Node 4 和 NPM 3 或更高版本. 安装 要安装Ang ...
随机推荐
- 适用于PyTorch 2.0.0的Ubuntu 22.04上CUDA v11.8和cuDNN 8.7安装指南
将下面内容保存为install.bash,直接用shell执行一把梭解决 #!/bin/bash ### steps #### # verify the system has a cuda-capab ...
- 说说RabbitMQ延迟队列实现原理?
使用 RabbitMQ 和 RocketMQ 的人是幸运的,因为这两个 MQ 自身提供了延迟队列的实现,不像用 Kafka 的同学那么苦逼,还要自己实现延迟队列.当然,这都是题外话,今天咱们重点来聊聊 ...
- 产品探秘:智影AI——你的创意视频制作神器!
只需3步,把小说变成视频.免费试用,首次注册赠送600积分. https://icomicai.com/ 在这个快节奏的时代,创意与效率并重成为了我们追求的新风尚.今天,就让我带你一起揭秘一款颠覆传统 ...
- 题解:P8144 [JRKSJ R4] BBWWBB
思路 分析题意可得,白方必定不会胜利,只能尽量让游戏无限进行下去.那么我们只考虑黑方能否胜利. 若想让戏能无限进行下去,必须满足以下条件. 白方先手. 若黑方先手必然可以吃掉一个白方,白方仅有一个棋子 ...
- LangChain的LCEL和Runnable你搞懂了吗
LangChain的LCEL估计行业内的朋友都听过,但是LCEL里的RunnablePassthrough.RunnableParallel.RunnableBranch.RunnableLambda ...
- mysql密码的初始化,修改与重置
目录 mysql密码的初始化,修改与重置 郑重说明: 初始化密码(第一次使用前要初始化密码) 查看密码(已登录状态) 修改密码(已知原密码) 忘记密码(密码找回) 诺mysql装在Windows 诺m ...
- 【Spring Data JPA】07 Specifications动态查询
[前言说明] 针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件 为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 Spe ...
- 【转载】【重磅】Gym发布 8 年后,迎来第一个完整环境文档,强化学习入门更加简单化!
2022年11月22日 更新 gym官方地址: https://www.gymlibrary.dev/ ========================================= 原文地址: ...
- vue3:setup语法糖使用教程
setup语法糖简介 直接在script标签中添加setup属性就可以直接使用setup语法糖了. 使用setup语法糖后,不用写setup函数:组件只需要引入不需要注册:属性和方法也不需要再返回,可 ...
- iOS开发基础149-由UUIDString引发的思考
问题1:[[UIDevice currentDevice] identifierForVendor].UUIDString什么情况下值会变化? [[UIDevice currentDevice] id ...