DEV Community

aiw3n
aiw3n

Posted on

Why Declare Components as Standalone in Modern Angular

Modern Angular versions introduced standalone components, a feature that simplifies project structure, enhances modularity, and reduces boilerplate. This approach makes Angular development more intuitive and aligns well with other modern frameworks like React or Vue. This post will explain why you should use standalone components and show how to implement them with an example using FormsModule.


What Are Standalone Components?

In traditional Angular, components are declared within NgModules. To use a component, directive, or pipe, you had to include it in a module and import that module in other parts of the app. While powerful, this approach has some drawbacks:

  • Overhead: Managing modules can be tedious, especially in large projects.
  • Complexity: Circular dependencies and unnecessary module imports can arise.
  • Tightly Coupled: Components are bound to specific modules, reducing flexibility.

Standalone components eliminate the need for NgModules. These components, along with standalone directives and pipes, declare their dependencies directly, resulting in simpler and more modular applications.


Why Use Standalone Components?

  1. Simplified Modular Design

    Each component is self-contained, with all dependencies declared directly in the component.

  2. Reduced Boilerplate

    There’s no need to create and maintain NgModules, leading to less repetitive code.

  3. Improved Tree-Shaking

    Angular can optimize the app more effectively by removing unused components.

  4. Faster Development

    Components can be created and used without worrying about module configuration.

  5. Future-Proof

    Standalone components are a core part of Angular's future, ensuring your applications are up-to-date with the latest standards.


Example: A Standalone Component with FormsModule

Let’s build a standalone PostFormComponent that allows users to create blog posts using Angular’s FormsModule.

1. Create the Component

Run the following command to generate the standalone component:

ng generate component post-form --standalone
Enter fullscreen mode Exit fullscreen mode

2. Implement the Component

Here’s the code for post-form.component.ts:

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

@Component({
  selector: 'app-post-form',
  standalone: true,
  imports: [FormsModule],
  template: `
    <form (ngSubmit)="submitForm()" #postForm="ngForm">
      <div>
        <label for="title">Title:</label>
        <input id="title" name="title" [(ngModel)]="post.title" required />
      </div>
      <div>
        <label for="content">Content:</label>
        <textarea id="content" name="content" [(ngModel)]="post.content" required></textarea>
      </div>
      <button type="submit" [disabled]="postForm.invalid">Submit</button>
    </form>
    <div *ngIf="submitted">
      <h3>Post Preview</h3>
      <p><strong>{{ post.title }}</strong></p>
      <p>{{ post.content }}</p>
    </div>
  `
})
export class PostFormComponent {
  post = {
    title: '',
    content: ''
  };
  submitted = false;

  submitForm() {
    this.submitted = true;
  }
}
Enter fullscreen mode Exit fullscreen mode

3. Use the Component

You can now bootstrap the standalone component directly in main.ts:

import { bootstrapApplication } from '@angular/platform-browser';
import { PostFormComponent } from './post-form.component';

bootstrapApplication(PostFormComponent)
  .catch(err => console.error(err));
Enter fullscreen mode Exit fullscreen mode

This approach eliminates the need for an AppModule. You directly bootstrap the PostFormComponent, making the application structure cleaner and more modular.

Top comments (0)