Async Components

Back

Loading concept...

Vue.js Async Components: The Magic of Loading Things Just When You Need Them 🎩


The Pizza Delivery Analogy 🍕

Imagine you’re throwing a big birthday party. You could order ALL the pizzas at once when guests arrive… but what if only 3 people show up first? You’d have cold pizzas sitting around!

Smart idea: Order each pizza only when a group of guests is ready to eat!

That’s exactly what Async Components do in Vue.js. Instead of loading everything at once (making your app slow to start), you load pieces only when someone actually needs them.


What Are Async Components?

Think of your Vue app like a big toy box. Loading everything at once is like dumping ALL toys on the floor before playing. Messy and slow!

Async Components = Taking out one toy at a time when you want to play with it.

Why This Is Amazing:

Without Async With Async
Load everything upfront Load only what’s needed
Slow first page load Fast first page load
Wasted bandwidth Save data/bandwidth
User waits longer User sees content faster

defineAsyncComponent: Your Magic Wand 🪄

This is the special spell Vue gives you to create async components.

Basic Example - The Simplest Way:

import { defineAsyncComponent } from 'vue'

const AsyncUserCard = defineAsyncComponent(
  () => import('./UserCard.vue')
)

What’s happening here?

  1. defineAsyncComponent = The magic wrapper
  2. () => import(...) = A promise that fetches the component
  3. The component loads ONLY when it’s actually used!

Using It In Your App:

<template>
  <div>
    <h1>Welcome!</h1>
    <!-- UserCard loads only when this renders -->
    <AsyncUserCard />
  </div>
</template>

<script setup>
import { defineAsyncComponent } from 'vue'

const AsyncUserCard = defineAsyncComponent(
  () => import('./UserCard.vue')
)
</script>

Loading State Components: The “Please Wait” Sign ⏳

When your pizza is being delivered, you see a “Preparing your order” message. Same idea!

While the async component is loading, you can show something friendly to the user.

Example With Loading Component:

import { defineAsyncComponent } from 'vue'

const AsyncDashboard = defineAsyncComponent({
  loader: () => import('./Dashboard.vue'),
  loadingComponent: LoadingSpinner,
  delay: 200  // Show spinner after 200ms
})

What Each Part Does:

graph TD A["User Visits Page"] --> B{Component Ready?} B -->|No, still loading| C["Show LoadingSpinner"] B -->|Yes!| D["Show Dashboard"] C -->|Loading complete| D

The delay Option:

  • Why use delay? If loading is super fast (under 200ms), no need to flash a spinner!
  • delay: 200 = Wait 200ms before showing loading state
  • Prevents flickering for fast connections

Complete Loading Example:

<script setup>
import { defineAsyncComponent } from 'vue'
import LoadingSpinner from './LoadingSpinner.vue'

const AsyncDashboard = defineAsyncComponent({
  loader: () => import('./Dashboard.vue'),
  loadingComponent: LoadingSpinner,
  delay: 200
})
</script>

<template>
  <AsyncDashboard />
</template>

Error Handling Components: The Safety Net 🛡️

What if the pizza delivery truck gets a flat tire? You need a backup plan!

If loading fails (network error, server down), show a helpful error message instead of a broken page.

Example With Error Handling:

import { defineAsyncComponent } from 'vue'

const AsyncChart = defineAsyncComponent({
  loader: () => import('./Chart.vue'),
  loadingComponent: LoadingSpinner,
  errorComponent: ErrorMessage,
  delay: 200,
  timeout: 10000  // Give up after 10 seconds
})

The Error Flow:

graph TD A["Start Loading"] --> B{Success?} B -->|Yes| C["Show Chart"] B -->|No - Network Error| D["Show ErrorMessage"] B -->|Taking too long| E{Timeout reached?} E -->|Yes| D E -->|No| F["Keep waiting..."] F --> B

Understanding Timeout:

  • timeout: 10000 = Wait max 10 seconds
  • After timeout, the errorComponent shows up
  • Default: No timeout (waits forever)

Full Error Handling Example:

<script setup>
import { defineAsyncComponent } from 'vue'
import LoadingSpinner from './LoadingSpinner.vue'
import ErrorDisplay from './ErrorDisplay.vue'

const AsyncHeavyChart = defineAsyncComponent({
  loader: () => import('./HeavyChart.vue'),
  loadingComponent: LoadingSpinner,
  errorComponent: ErrorDisplay,
  delay: 200,
  timeout: 10000,
  onError(error, retry, fail, attempts) {
    if (attempts <= 3) {
      retry()  // Try again!
    } else {
      fail()   // Give up, show error
    }
  }
})
</script>

<template>
  <AsyncHeavyChart />
</template>

The onError Callback - Your Retry Button:

Parameter What It Does
error The actual error that happened
retry Function to try loading again
fail Function to give up and show error
attempts How many times we’ve tried

Real-World Example: A Complete Setup 🌟

Let’s build a page with multiple async components, each with proper loading and error states!

<script setup>
import { defineAsyncComponent } from 'vue'
import Skeleton from './Skeleton.vue'
import ErrorCard from './ErrorCard.vue'

// Helper function to create async components
function createAsync(loader) {
  return defineAsyncComponent({
    loader,
    loadingComponent: Skeleton,
    errorComponent: ErrorCard,
    delay: 150,
    timeout: 8000
  })
}

// Now create your async components easily!
const UserProfile = createAsync(
  () => import('./UserProfile.vue')
)
const ActivityFeed = createAsync(
  () => import('./ActivityFeed.vue')
)
const StatsChart = createAsync(
  () => import('./StatsChart.vue')
)
</script>

<template>
  <div class="dashboard">
    <UserProfile />
    <ActivityFeed />
    <StatsChart />
  </div>
</template>

Quick Comparison Table 📊

Feature Simple Async With Loading Full Setup
Basic lazy load âś… âś… âś…
Loading spinner ❌ ✅ ✅
Error message ❌ ❌ ✅
Retry on failure ❌ ❌ ✅
Timeout ❌ ❌ ✅

Summary: The 4 Key Pieces đź§©

  1. Async Components = Load components only when needed (like ordering pizza when guests arrive)

  2. defineAsyncComponent = The Vue function that makes any component async

  3. Loading State = What users see while waiting (the “preparing your order” sign)

  4. Error Handling = What users see if something goes wrong (the backup plan)


Pro Tips đź’ˇ

Tip 1: Use async components for heavy things like charts, maps, or rich text editors.

Tip 2: Keep your loading components tiny! They load synchronously.

Tip 3: Set reasonable timeouts. 10-15 seconds is usually good.

Tip 4: Always provide retry options for better user experience.


Remember: Async components are like smart pizza delivery - you get what you need, exactly when you need it, without making everyone wait! 🍕✨

Loading story...

Story - Premium Content

Please sign in to view this story and start learning.

Upgrade to Premium to unlock full access to all stories.

Stay Tuned!

Story is coming soon.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.