DeployU
Interviews / Frontend Engineering / What is the difference between a component and a directive in Angular?

What is the difference between a component and a directive in Angular?

conceptual Core Concepts Interactive Quiz Code Examples

The Scenario

You are a frontend engineer at a social media company. You are building a new feature that needs to add some custom behavior to an existing HTML element.

You are not sure whether to create a new component or a new directive.

The Challenge

Explain the difference between a component and a directive in Angular. What are the pros and cons of each approach, and which one would you choose for this use case?

Wrong Approach

A junior engineer might think that they are interchangeable. They might try to use a component to do something that could be more easily done with a directive.

Right Approach

A senior engineer would be able to provide a detailed explanation of the differences between a component and a directive. They would also be able to explain the trade-offs between each approach and would have a clear recommendation for which one to use in this use case.

Step 1: Understand the Key Differences

FeatureComponentDirective
PurposeTo create a new UI element with its own template and logic.To add some custom behavior to an existing HTML element.
TemplateHas a template.Does not have a template.
Syntax<my-component></my-component><div my-directive></div>
Use CasesWhen you need to create a new UI element.When you need to add some custom behavior to an existing HTML element.

Step 2: Choose the Right Tool for the Job

For our use case, we should use a directive. This is because we want to add some custom behavior to an existing HTML element, not create a new UI element.

Step 3: Code Examples

Here are some code examples that show the difference between the two approaches:

Component:

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

@Component({
  selector: 'my-component',
  template: '<h1>Hello, world!</h1>'
})
export class MyComponent {}

Directive:

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

@Directive({
  selector: '[myDirective]'
})
export class MyDirective {
  constructor(el: ElementRef) {
    el.nativeElement.style.backgroundColor = 'yellow';
  }
}

Practice Question

You want to create a reusable component that can be used to display a user's profile information. Which of the following would you use?