Angular 教程

Angular 20 独立组件——signal 输入、OnPush 变更检测、内联模板、零 NgModule、零 CSS。

你将构建什么

一个小型联系表单——带标签的输入框、提交按钮、双向绑定,以及真实的键盘和屏幕阅读器行为——先是不带样式的版本,再加上样式,大约 10 分钟完成。

开始之前

你需要 git、Node 22 或更高版本,以及 pnpm 10 或更高版本。任何 Angular 20 项目都可以——Angular CLI 或 Analog。

第 1 步——获取代码

git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-angular-headless
pnpm install
pnpm test        # vitest + TestBed, all 571 components
pnpm run build-storybook

组件是 components/ 中的扁平文件—— Button.ts、TextInput.ts——每个都是带内联模板的独立组件,另有它的测试规范和 story。入口文件 index.ts 重新导出每个组件;pnpm build 通过 ng-packagr 生成 Angular Package Format 的打包产物。

第 2 步——你的第一个组件

import { Component } from "@angular/core";
import { Button } from "@lilydesignsystem/angular-headless";

@Component({
  selector: "app-save-bar",
  standalone: true,
  imports: [Button],
  template: `<lily-button (click)="save()">Save</lily-button>`,
})
export class SaveBar {
  save() { console.log("saved"); }
}

每个组件都声明一个 lily-* 选择器,并渲染带有类名钩子的语义化元素——这里是 <button class="button" type="button">。输入基于 signal:用 label() 覆盖 aria-label,用 className() 追加类名。

第 3 步——组合一个小表单

import { Component, signal } from "@angular/core";
import { Form, Field, TextInput, Button } from "@lilydesignsystem/angular-headless";

@Component({
  selector: "app-contact-form",
  standalone: true,
  imports: [Form, Field, TextInput, Button],
  template: `
    <lily-form label="Contact form" (submit)="handleSubmit($event)">
      <lily-field label="Full name" [required]="true">
        <lily-text-input id="name" label="Full name" [(value)]="name" />
      </lily-field>
      <lily-button type="submit">Save</lily-button>
    </lily-form>
  `,
})
export class ContactForm {
  name = signal("");
}

lily-field 把可见的标签作为自己的 label 输入,而不是嵌套一个标签组件——只需在 field 上传入一次,lily-text-input 对应的 label 就会提供可访问名称。类输入组件暴露 model() 值,所以“香蕉盒”写法 [(value)] 的双向绑定开箱即用——全程兼容 zoneless。

2026-08-29 已验证:早期草稿在 lily-field 里嵌套了单独的 Label 组件,结果渲染出两个标签(其中一个为空),因为 lily-field 已经会根据 label 输入渲染自己的标签——这是通过检查组件源码发现的。 联系表单组合路由 采用同样的模式,并经过真实的端到端测试和 axe 测试。

检查你的成果:运行应用,表单看起来很朴素——这正是预期:样式还在后面。按下 Tab:焦点会依次经过每个控件,标签会被朗读,提交也能正常工作。行为已经完成;外观由你决定,这就是下一步。

第 4 步——添加样式

在 styles.css 中为这些类名钩子设置样式——.button、.text-input、 .label、.field——或者把一个现成的主题加入 angular.json 的 styles 数组,或在 index.html 中链接它:

<link rel="stylesheet" href="/themes/adobe-spectrum.css" />

第 5 步——看看它的完整效果

Angular + Analog 示例应用用基于文件的路由和 Vite 展示完整目录:

git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-angular-examples
pnpm install && pnpm run dev

下一步

  • 主题——用 Angular 的 theme-picker 辅助包在运行时切换主题。
  • 偏好设置辅助包——语言与文字大小。
  • 组件目录——每个组件的 props、ARIA 和键盘操作。

过程中有疑问?帮助页面里有大量解答——如果某一步可以写得更清楚, 请告诉我们,我们很乐意改进教程。