@Directive 与 @Component 在 Angular 中的区别:2024 年新手该如何选择?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么这个问题在 Stack Overflow 上炸开了锅(也让你的大脑爆炸)?

\n

你在编写你的第一个 Angular 项目。创建一个组件,给它加上 @Component 装饰器——一切正常。然后你在别人的代码中看到了 @Directive,心想:“为什么用这个?这不是一样的吗?”剧透:不,不一样。但 90% 的新手都会感到困惑。

\n

“@Directive vs @Component in Angular”这个问题在 Stack Overflow 上获得了数千次浏览,这并非偶然。让我们一劳永逸地弄清楚它们的区别、何时使用什么,以及如何在面试中不丢脸。开始吧!

\n\n

什么是 @Component?(剧透:它也是 @Directive)

\n

首先——揭晓真相。@Component 是 @Directive 的一个子类型。是的,你没听错。Angular 中的任何组件都是一个指令。但有一个重要的区别:组件拥有模板(template)。

\n

@Component 装饰器继承了 @Directive 的所有特性,并增加了它自己的“亮点”——渲染 HTML 的能力。如果说指令是“行为”,那么组件就是“行为 + 界面片段”。

\n\n

一个简单的 TypeScript 组件示例

\n
import { Component } from '@angular/core';\n\n@Component({\n  selector: 'app-hello',\n  template: `<h1>你好,{{name}}!</h1>`,\n  styles: ['h1 { color: blue; }']\n})\nexport class HelloComponent {\n  name: string = '世界';\n}\n
\n

这里的 HelloComponent 是一个完整的组件。它有自己的模板、样式和逻辑。它可以在另一个模板中作为 <app-hello></app-hello> 使用。

\n\n

什么是 @Directive?(纯粹的行为)

\n

指令是一个带有 @Directive 装饰器的类,它修改现有 DOM 元素的行为或外观。指令没有自己的模板。它不创建新元素——它“附着”在已有元素上。

\n

Angular 中有三种类型的指令:

\n
    \n
  • 组件(是的,它们也是指令)——带有模板。
  • \n
  • 结构型指令——修改 DOM 结构(*ngIf、*ngFor)。
  • \n
  • 属性型指令——改变元素的外观或行为(ngClass、ngStyle)。
  • \n
\n\n

一个 TypeScript 属性型指令示例

\n
import { Directive, ElementRef, HostListener } from '@angular/core';\n\n@Directive({\n  selector: '[appHighlight]'\n})\nexport class HighlightDirective {\n  constructor(private el: ElementRef) {}\n\n  @HostListener('mouseenter') onMouseEnter() {\n    this.el.nativeElement.style.backgroundColor = 'yellow';\n  }\n\n  @HostListener('mouseleave') onMouseLeave() {\n    this.el.nativeElement.style.backgroundColor = null;\n  }\n}\n
\n

这个指令在鼠标悬停时将元素高亮为黄色。它不创建新的 DOM 节点——它“修改”现有的节点。使用方式如下:<div appHighlight>悬停在我上面</div>。

\n\n

@Directive 与 @Component 的关键区别

\n

让我们来逐一梳理。下面这张表格将帮助你一劳永逸地记住它们的区别:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
特性@Component@Directive
是否有模板(template)✅ 是,必须的❌ 没有
是否创建新的 DOM 元素✅ 是(通过选择器)❌ 否(应用于已有元素)
是否有样式(styles)✅ 是,可以隔离❌

博客

书籍推荐