@Component@Directive在Angular 上有什么区别?

什么是用例,什么时候更喜欢一个而不是另一个?

推荐答案

A @Component requires a view whereas a @Directive does not.

指令

我将@Directive比作带有选项restrict: 'A'的Angular 1.0指令(指令不限于属性用法)指令向现有DOM元素或现有组件实例添加行为.指令的一个示例用例是记录对元素的点击.

import {Directive} from '@angular/core';

@Directive({
    selector: "[logOnClick]",
    hostListeners: {
        'click': 'onClick()',
    },
})
class LogOnClick {
    constructor() {}
    onClick() { console.log('Element clicked!'); }
}

这样使用:

<button logOnClick>I log when clicked!</button>

组件

组件不是添加/修改行为,而是创建自己的视图(DOM元素的层次 struct )和附加的行为.这方面的一个示例用例可能是联系人卡组件:

import {Component, View} from '@angular/core';

@Component({
  selector: 'contact-card',
  template: `
    <div>
      <h1>{{name}}</h1>
      <p>{{city}}</p>
    </div>
  `
})
class ContactCard {
  @Input() name: string
  @Input() city: string
  constructor() {}
}

这样使用:

<contact-card [name]="'foo'" [city]="'bar'"></contact-card>

ContactCard是一个可重用的UI组件,我们可以在应用程序中的任何地方使用,甚至在其他组件中也可以使用.这些基本上构成了我们应用程序的UI构建块.

总之

当您想要创建一组具有自定义行为的可重用的UI DOM元素时,请编写一个组件.当您想要编写可重用行为以补充现有DOM元素时,请编写一条指令.

资料来源:

Typescript相关问答推荐

使用类和子类以及迭代类属约束对类属递数据 struct 建模

如何根据数据类型动态注入组件?

如果我有对象的Typescript类型,如何使用其值的类型?

Angular 17 -如何在for循环内创建一些加载?

node—redis:如何在redis timeSeries上查询argmin?

当使用`type B = A`时,B的类型显示为A.为什么当`type B = A时显示为`any `|用A代替?

将值添加到具有不同类型的对象的元素

如何以Angular 形式显示验证错误消息

在Mac和Windows上运行的Web应用程序出现这种对齐差异的原因是什么?(ReactNative)

类型';字符串|数字';不可分配给类型';未定义';.类型';字符串';不可分配给类型';未定义';

复选框Angular 在Ngfor中的其他块中重复

TypeScrip-如何自动推断UNION变量的类型

在抽象类属性定义中扩展泛型类型

有没有办法传递泛型类型数组,以便推断每个元素的泛型类型?

打字脚本错误:`不扩展[Type]`,而不是直接使用`[Type]`

有没有一种更好的方法来存储内存中的数据,而不是在类型脚本中使用数组和基于索引的函数?

在TS泛型和记录类型映射方面有问题

typescript如何从映射类型推断

Typescript 子类继承的方法允许参数中未定义的键

为什么 Typescript 无法正确推断数组元素的类型?