ngx-toastr vs @ngneat/hot-toast
Angular Toast Notifications
ngx-toastr@ngneat/hot-toastSimilar Packages:
Angular Toast Notifications

Toast notifications are small, unobtrusive messages that appear on the screen to provide feedback to users. They are commonly used in web applications to display success, error, warning, or informational messages without interrupting the user's workflow. Toast notifications automatically disappear after a short duration, but they can also be configured to remain on the screen until the user interacts with them. This makes them ideal for providing non-intrusive alerts, confirmations, or status updates. @ngneat/hot-toast is a modern, lightweight toast notification library for Angular that offers a simple API, customizable styles, and supports multiple toast types (success, error, info, warning). It is designed for ease of use and minimal configuration, making it suitable for projects that require quick and effective notifications without a large footprint. ngx-toastr is a popular toast notification library for Angular that provides highly customizable and animated toast messages. It supports multiple notification types, allows for manual dismissal, and offers extensive configuration options for positioning, duration, and styling. ngx-toastr is well-suited for applications that need more control over the appearance and behavior of toast notifications, making it a versatile choice for both simple and complex use cases.

Npm Package Weekly Downloads Trend
3 Years
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
ngx-toastr283,8622,588359 kB794 months agoMIT
@ngneat/hot-toast2,643-401 kB-2 years agoMIT
Feature Comparison: ngx-toastr vs @ngneat/hot-toast

Size and Performance

  • ngx-toastr:

    ngx-toastr is larger than @ngneat/hot-toast due to its extensive feature set and customization options. While it may have a slightly higher impact on load times, it is still performant and suitable for most applications. The trade-off in size is justified by the added flexibility and control it provides over toast notifications.

  • @ngneat/hot-toast:

    @ngneat/hot-toast is designed to be lightweight and performant, with a small bundle size that minimizes impact on application load times. Its simplicity and modern implementation ensure fast rendering of toast notifications, making it suitable for performance-sensitive applications.

Customization

  • ngx-toastr:

    ngx-toastr excels in customization, allowing developers to fully control the appearance and behavior of toast notifications. It supports custom templates, animations, positioning, and styling, making it highly versatile for applications that require a tailored notification experience.

  • @ngneat/hot-toast:

    @ngneat/hot-toast offers basic customization options, including the ability to change toast styles, durations, and types (success, error, info, warning). However, it is designed to be simple and may not provide as much depth in customization as ngx-toastr.

API Simplicity

  • ngx-toastr:

    ngx-toastr provides a comprehensive API for managing toast notifications, but its complexity may require more time to fully understand and utilize all features. While it is well-documented, the richness of its API can be overwhelming for new users.

  • @ngneat/hot-toast:

    @ngneat/hot-toast features a simple and intuitive API that makes it easy to create and manage toast notifications with minimal code. Its straightforward design allows developers to quickly integrate it into their applications without a steep learning curve.

Animation and Transitions

  • ngx-toastr:

    ngx-toastr offers highly customizable animations and transitions for toast notifications. Developers can easily configure the entrance and exit animations, as well as the duration and timing, allowing for a more dynamic and engaging notification experience.

  • @ngneat/hot-toast:

    @ngneat/hot-toast includes smooth animations for toast appearance and disappearance, enhancing the user experience without being distracting. The animations are subtle and can be customized to some extent, but they are not as extensive as those offered by ngx-toastr.

Ease of Use: Code Examples

  • ngx-toastr:

    Basic usage of ngx-toastr

    import { ToastrModule } from 'ngx-toastr';
    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
    
    @NgModule({
      imports: [
        BrowserAnimationsModule,
        ToastrModule.forRoot() // ToastrModule added
      ]
    })
    export class AppModule {}
    
    // In a component
    import { ToastrService } from 'ngx-toastr';
    
    constructor(private toastr: ToastrService) {}
    
    this.toastr.success('Success message!');
    this.toastr.error('Error message!');
    
  • @ngneat/hot-toast:

    Basic usage of @ngneat/hot-toast

    import { HotToastModule } from '@ngneat/hot-toast';
    
    @NgModule({
      imports: [HotToastModule]
    })
    export class AppModule {}
    
    // In a component
    import { HotToastService } from '@ngneat/hot-toast';
    
    constructor(private toast: HotToastService) {}
    
    this.toast.success('Success message!');
    this.toast.error('Error message!');
    
How to Choose: ngx-toastr vs @ngneat/hot-toast
  • ngx-toastr:

    Choose ngx-toastr if you need a feature-rich toast library with extensive customization options, including animations, positioning, and the ability to create different types of notifications. It is suitable for applications that require more control over the notification appearance and behavior.

  • @ngneat/hot-toast:

    Choose @ngneat/hot-toast if you need a lightweight, easy-to-use toast library with a modern design and minimal configuration. It is ideal for projects that require quick integration and a clean user interface without a lot of overhead.

README for ngx-toastr
Angular Toastr

ngx-toastr


npm codecov

DEMO: https://ngx-toastr.vercel.app

Features

  • Toast Component Injection without being passed ViewContainerRef
  • No use of *ngFor. Fewer dirty checks and higher performance.
  • AoT compilation and lazy loading compatible
  • Component inheritance for custom toasts
  • SystemJS/UMD rollup bundle
  • Animations using Angular's Web Animations API
  • Output toasts to an optional target directive

Dependencies

Latest version available for each version of Angular

ngx-toastrAngular
13.2.110.x 11.x
14.3.012.x 13.x
15.2.214.x.
16.2.015.x
17.0.216.x
current>= 17.x

Install

npm install ngx-toastr --save

@angular/animations package is a required dependency for the default toast

npm install @angular/animations --save

Don't want to use @angular/animations? See Setup Without Animations.

Setup

step 1: add css

  • copy toast css to your project.
  • If you are using sass you can import the css.
// regular style toast
@import 'ngx-toastr/toastr';

// bootstrap style toast
// or import a bootstrap 4 alert styled design (SASS ONLY)
// should be after your bootstrap imports, it uses bs4 variables, mixins, functions
@import 'ngx-toastr/toastr-bs4-alert';

// if you'd like to use it without importing all of bootstrap it requires
@import 'bootstrap/scss/functions';
@import 'bootstrap/scss/variables';
@import 'bootstrap/scss/mixins';
// bootstrap 4
@import 'ngx-toastr/toastr-bs4-alert';
// boostrap 5
@import 'ngx-toastr/toastr-bs5-alert';
  • If you are using angular-cli you can add it to your angular.json
"styles": [
  "styles.scss",
  "node_modules/ngx-toastr/toastr.css" // try adding '../' if you're using angular cli before 6
]

step 2: add ToastrModule to app NgModule, or provideToastr to providers, make sure you have BrowserAnimationsModule (or provideAnimations) as well.

  • Module based
import { CommonModule } from '@angular/common';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

import { ToastrModule } from 'ngx-toastr';

@NgModule({
  imports: [
    CommonModule,
    BrowserAnimationsModule, // required animations module
    ToastrModule.forRoot(), // ToastrModule added
  ],
  bootstrap: [App],
  declarations: [App],
})
class MainModule {}
  • Standalone
import { AppComponent } from './src/app.component';
import { provideAnimations } from '@angular/platform-browser/animations';

import { provideToastr } from 'ngx-toastr';

bootstrapApplication(AppComponent, {
  providers: [
    provideAnimations(), // required animations providers
    provideToastr(), // Toastr providers
  ]
});

Use

import { ToastrService } from 'ngx-toastr';

@Component({...})
export class YourComponent {
  constructor(private toastr: ToastrService) {}

  showSuccess() {
    this.toastr.success('Hello world!', 'Toastr fun!');
  }
}

Options

There are individual options and global options.

Individual Options

Passed to ToastrService.success/error/warning/info/show()

OptionTypeDefaultDescription
toastComponentComponentToastAngular component that will be used
closeButtonbooleanfalseShow close button
timeOutnumber5000Time to live in milliseconds
extendedTimeOutnumber1000Time to close after a user hovers over toast
disableTimeOutboolean | 'timeOut' | 'extendedTimeOut'falseDisable both timeOut and extendedTimeOut when set to true. Allows specifying which timeOut to disable, either: timeOut or extendedTimeOut
easingstring'ease-in'Toast component easing
easeTimestring | number300Time spent easing
enableHtmlbooleanfalseAllow html in message
newestOnTopbooleantrueNew toast placement
progressBarbooleanfalseShow progress bar
progressAnimation'decreasing' | 'increasing''decreasing'Changes the animation of the progress bar.
toastClassstring'ngx-toastr'CSS class(es) for toast
positionClassstring'toast-top-right'CSS class(es) for toast container
titleClassstring'toast-title'CSS class(es) for inside toast on title
messageClassstring'toast-message'CSS class(es) for inside toast on message
tapToDismissbooleantrueClose on click
onActivateTickbooleanfalseFires changeDetectorRef.detectChanges() when activated. Helps show toast from asynchronous events outside of Angular's change detection

Setting Individual Options

success, error, info, warning take (message, title, ToastConfig) pass an options object to replace any default option.

this.toastrService.error('everything is broken', 'Major Error', {
  timeOut: 3000,
});

Global Options

All individual options can be overridden in the global options to affect all toasts. In addition, global options include the following options:

OptionTypeDefaultDescription
maxOpenednumber0Max toasts opened. Toasts will be queued. 0 is unlimited
autoDismissbooleanfalseDismiss current toast when max is reached
iconClassesobjectsee belowClasses used on toastr service methods
preventDuplicatesbooleanfalseBlock duplicate messages
countDuplicatesbooleanfalseDisplays a duplicates counter (preventDuplicates must be true). Toast must have a title and duplicate message
resetTimeoutOnDuplicatebooleanfalseReset toast timeout on duplicate (preventDuplicates must be true)
includeTitleDuplicatesbooleanfalseInclude the title of a toast when checking for duplicates (by default only message is compared)
iconClasses defaults
iconClasses = {
  error: 'toast-error',
  info: 'toast-info',
  success: 'toast-success',
  warning: 'toast-warning',
};

Setting Global Options

Pass values to ToastrModule.forRoot() or provideToastr() to set global options.

  • Module based
// root app NgModule
imports: [
  ToastrModule.forRoot({
    timeOut: 10000,
    positionClass: 'toast-bottom-right',
    preventDuplicates: true,
  }),
],
  • Standalone
import { AppComponent } from './src/app.component';
import { provideAnimations } from '@angular/platform-browser/animations';

import { provideToastr } from 'ngx-toastr';

bootstrapApplication(AppComponent, {
  providers: [
    provideToastr({
      timeOut: 10000,
      positionClass: 'toast-bottom-right',
      preventDuplicates: true,
    }), 
  ]
});

Toastr Service methods return:

export interface ActiveToast {
  /** Your Toast ID. Use this to close it individually */
  toastId: number;
  /** the title of your toast. Stored to prevent duplicates if includeTitleDuplicates set */
  title: string;
  /** the message of your toast. Stored to prevent duplicates */
  message: string;
  /** a reference to the component see portal.ts */
  portal: ComponentRef<any>;
  /** a reference to your toast */
  toastRef: ToastRef<any>;
  /** triggered when toast is active */
  onShown: Observable<any>;
  /** triggered when toast is destroyed */
  onHidden: Observable<any>;
  /** triggered on toast click */
  onTap: Observable<any>;
  /** available for your use in custom toast */
  onAction: Observable<any>;
}

Put toasts in your own container

Put toasts in a specific div inside your application. This should probably be somewhere that doesn't get deleted. Add ToastContainerModule to the ngModule where you need the directive available. Make sure that your container has an aria-live="polite" attribute, so that any time a toast is injected into the container it is announced by screen readers.

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

import { ToastrModule, ToastContainerModule } from 'ngx-toastr';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    BrowserAnimationsModule,

    ToastrModule.forRoot({ positionClass: 'inline' }),
    ToastContainerModule,
  ],
  providers: [],
  bootstrap: [AppComponent],
})
export class AppModule {}

Add a div with toastContainer directive on it.

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

import { ToastContainerDirective, ToastrService } from 'ngx-toastr';

@Component({
  selector: 'app-root',
  template: `
    <h1><a (click)="onClick()">Click</a></h1>
    <div aria-live="polite" toastContainer></div>
  `,
})
export class AppComponent implements OnInit {
  @ViewChild(ToastContainerDirective, { static: true })
  toastContainer: ToastContainerDirective;

  constructor(private toastrService: ToastrService) {}
  ngOnInit() {
    this.toastrService.overlayContainer = this.toastContainer;
  }
  onClick() {
    this.toastrService.success('in div');
  }
}

Functions

Clear

Remove all or a single toast by optional id

toastrService.clear(toastId?: number);
Remove

Remove and destroy a single toast by id

toastrService.remove(toastId: number);

SystemJS

If you are using SystemJS, you should also adjust your configuration to point to the UMD bundle.

In your SystemJS config file, map needs to tell the System loader where to look for ngx-toastr:

map: {
  'ngx-toastr': 'node_modules/ngx-toastr/bundles/ngx-toastr.umd.min.js',
}

Setup Without Animations

If you do not want to include @angular/animations in your project you can override the default toast component in the global config to use ToastNoAnimation instead of the default one.

In your main module (ex: app.module.ts)

import { ToastrModule, ToastNoAnimation, ToastNoAnimationModule } from 'ngx-toastr';

@NgModule({
  imports: [
    // ...

    // BrowserAnimationsModule no longer required
    ToastNoAnimationModule.forRoot(),
  ],
  // ...
})
class AppModule {}

That's it! Animations are no longer required.

Using A Custom Toast

Create your toast component extending Toast see the demo's pink toast for an example https://github.com/scttcper/ngx-toastr/blob/master/src/app/pink.toast.ts

import { ToastrModule } from 'ngx-toastr';

@NgModule({
  imports: [
    ToastrModule.forRoot({
      toastComponent: YourToastComponent, // added custom toast!
    }),
  ],
  bootstrap: [App],
  declarations: [App, YourToastComponent], // add!
})
class AppModule {}

FAQ

  1. ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked
    When opening a toast inside an angular lifecycle wrap it in setTimeout
ngOnInit() {
    setTimeout(() => this.toastr.success('sup'))
}
  1. Change default icons (check, warning sign, etc)
    Overwrite the css background-image: https://github.com/scttcper/ngx-toastr/blob/master/src/lib/toastr.css.
  2. How do I use this in an ErrorHandler?
    See: https://github.com/scttcper/ngx-toastr/issues/179.
  3. How can I translate messages?
    See: https://github.com/scttcper/ngx-toastr/issues/201.
  4. How to handle toastr click/tap action?
    showToaster() {
      this.toastr.success('Hello world!', 'Toastr fun!')
        .onTap
        .pipe(take(1))
        .subscribe(() => this.toasterClickedHandler());
    }
    
    toasterClickedHandler() {
      console.log('Toastr clicked');
    }
    
  5. How to customize styling without overridding defaults?
    Add multiple CSS classes separated by a space:
    toastClass: 'yourclass ngx-toastr'
    
    See: https://github.com/scttcper/ngx-toastr/issues/594.

Previous Works

toastr original toastr
angular-toastr AngularJS toastr
notyf notyf (css)

License

MIT


GitHub @scttcper  ·  Twitter @scttcper