Какая разница между директивами и компонентами в ангуларе? Этот вопрос мучает многих фронт-энд разработчиков, изучающих Angular и на начальных этапах это, не совсем ясно, когда их использовать.

@Directive

Обычно директивы — это маленькие куски кода, которые добавляют функциональность к существующему элементу DOM. Они очень похожи на компоненты, но только не обладают шаблоном. Директива должна иметь селектор, чтобы привязать свою функциональность к элементу на странице. Например:

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

@Directive({
  selector: '[consoleLog]'
})
export class consoleLogDirective {
  constructor() {
    //Вывод строки в консоль.
    console.log('Это директива');
  }
}

В HTML это будут выглядеть вот так:

<p consoleLog>Я простой параграф!</p>

В данном примере селектором служит атрибут. Селектор может быть по элементу или классу, или комбинацией всех.

@Component

Во фреймворке класс Component наследуется от класса Directive, поэтому можно сказать, что компоненты, это те же директивы, но с дополнительными возможностями. Компонент не привязывается к элементам DOM, а вместо этого создает свою собственную иерархию элементов и с ней работает. Например:

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

@Directive({
  selector: '[simpleParagraph]',
  template: `<p>Я простой параграф!</p>`
})
export class simpleParagraphComponent {
  constructor() {
    //Вывод строки в консоль.
    console.log('Это компонент');
  }
}

Например, в вашем SPA, компонент вставляется как:

<simpleParagraph></simpleParagraph>

Как видно, что компонент, очень похож на предыдущую директиву. Разница в декораторе и его свойствах. Тут свойство selector несколько отличается, оно задает имя для тега, который используется для вставки данного компонента в другой. А дополнительное свойство template, задает шаблон для вставки. Вместо template, можно использовать templateUrl и использовать ссылку на внешний HTML файл.

Итак, со сходством и разницей компонентов и директивами в Angular разобрались. Когда же их использовать? Все очень просто. Если нужно вставить большой кусок HTML со своей логикой и функциональностью нужно использовать компонент, если нежно добавить только функциональность к уже существующим элементам, то – директивы.