📖 Scenario: You are building a Vue app that shows user profiles. The profile data loads slowly from the server. You want to show a loading message while the profile component is loading.
🎯 Goal: Create a Vue app that uses <Suspense> to show a loading message while an async profile component loads.
📋 What You'll Learn
Create a basic Vue app with a root component
Define an async component called UserProfile that simulates loading delay
Use a loadingMessage variable to show while loading
Wrap UserProfile inside <Suspense> with a fallback slot
Ensure the loading message shows until the async component is ready
💡 Why This Matters
🌍 Real World
Many web apps load parts of their UI asynchronously to improve speed and user experience. Using <code><Suspense></code> helps show loading states smoothly.
💼 Career
Understanding async components and suspense is important for frontend developers working with Vue to build responsive and user-friendly interfaces.
Progress0 / 4 steps
1
Create the async component UserProfile
Create an async component called UserProfile using defineAsyncComponent that simulates a 2-second delay before resolving. The component should render a <div> with the text User Profile Loaded.
Vue
Hint
Use defineAsyncComponent and return a Promise that resolves after 2 seconds with a simple template.
2
Add a loadingMessage variable
Inside the <script setup>, create a constant called loadingMessage and set it to the string 'Loading user profile...'.
Vue
Hint
Use const loadingMessage = 'Loading user profile...' to create the variable.
3
Use <Suspense> with fallback slot
In the <template>, add a <Suspense> component. Inside it, place the <UserProfile /> component. Add a <template #fallback> slot that displays the loadingMessage variable inside a <div>.
Vue
Hint
Wrap <UserProfile /> inside <Suspense>. Use <template #fallback> to show loadingMessage.
4
Complete the Vue app with import and registration
Add the import statement for Suspense from 'vue' inside <script setup>. Register UserProfile as a component by adding it to the components option in the <script setup> block.
Vue
Hint
Import Suspense from 'vue' alongside defineAsyncComponent.
Practice
(1/5)
1. What is the main purpose of the <Suspense> component in Vue?
easy
A. To show fallback content while async components are loading
B. To handle errors in synchronous components
C. To style components with CSS
D. To manage global state across components
Solution
Step 1: Understand what async components do
Async components load their code or data asynchronously, which can take some time.
Step 2: Role of <Suspense>
The <Suspense> component shows fallback content during this loading time to improve user experience.
Final Answer:
To show fallback content while async components are loading -> Option A
Quick Check:
Suspense = fallback content during loading [OK]
Hint: Suspense shows a placeholder while waiting for async parts [OK]
Common Mistakes:
Confusing Suspense with error handling
Thinking Suspense manages CSS or styling
Assuming Suspense manages global state
2. Which of the following is the correct way to use <Suspense> with a fallback in Vue?
easy
A. <Suspense><AsyncComp /><template fallback>Loading...</template></Suspense>
B. <Suspense fallback="Loading..."><AsyncComp /></Suspense>
C. <Suspense><template #fallback>Loading...</template><AsyncComp /></Suspense>
D. <Suspense><AsyncComp fallback="Loading..." /></Suspense>
Solution
Step 1: Check Vue Suspense syntax
Vue uses a named slot #fallback inside <Suspense> to show fallback content.
Step 2: Validate the options
<Suspense><template #fallback>Loading...</template><AsyncComp /></Suspense> correctly uses <template #fallback> with fallback text and wraps the async component inside Suspense.
Final Answer:
<Suspense><template #fallback>Loading...</template><AsyncComp /></Suspense> -> Option C
A. Fallback content must be a component, not a template
B. The fallback template must use #fallback slot syntax
C. Suspense cannot wrap async components
D. AsyncComp must be wrapped in a div
Solution
Step 1: Check fallback slot syntax
The fallback slot requires the named slot syntax #fallback inside <template>.
Step 2: Identify the error in code
The code uses <template fallback> instead of <template #fallback>, which is invalid.
Final Answer:
The fallback template must use #fallback slot syntax -> Option B
Quick Check:
Fallback slot needs #fallback syntax = The fallback template must use #fallback slot syntax [OK]
Hint: Use not for fallback slot [OK]
Common Mistakes:
Omitting the # in fallback slot
Wrapping async component unnecessarily
Thinking fallback must be a separate component
5. You want to show a loading spinner while two async components load in parallel inside Suspense. Which approach correctly shows fallback until both finish loading?
hard
A. <Suspense><template #fallback><Spinner /></template><AsyncComp1 /><AsyncComp2 /></Suspense>
B. <Suspense><AsyncComp1 /><template fallback><Spinner /></template><AsyncComp2 /></Suspense>
C. <Suspense><AsyncComp1 /><AsyncComp2 /></Suspense><template #fallback><Spinner /></template>
D. <Suspense><template #fallback><Spinner /></template><AsyncComp1 /></Suspense><Suspense><template #fallback><Spinner /></template><AsyncComp2 /></Suspense>
Solution
Step 1: Understand Suspense behavior with multiple async components
A single Suspense wrapping multiple async components waits for all to load before showing content.
Step 2: Check fallback placement
The fallback slot must be declared once inside Suspense before the async components to show fallback while any are loading.
Final Answer:
<Suspense><template #fallback><Spinner /></template><AsyncComp1 /><AsyncComp2 /></Suspense> -> Option A
Quick Check:
Single Suspense with fallback wraps all async components = <Suspense><template #fallback><Spinner /></template><AsyncComp1 /><AsyncComp2 /></Suspense> [OK]
Hint: Wrap all async components in one Suspense with fallback slot [OK]
Common Mistakes:
Placing fallback after async components
Using multiple Suspense components separately
Putting fallback outside Suspense
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.