Fallback UI patterns show a simple message or design when the main content is loading or has an error. This helps users understand what is happening instead of seeing a blank screen.
Fallback UI patterns in React
function Component({ loading, error }) { if (loading) { return <FallbackUI />; } if (error) { return <ErrorUI />; } return <MainContent />; }
Use simple conditional checks to decide which UI to show.
Fallback UI can be a spinner, message, or any React element.
function Loading() { return <p>Loading...</p>; } function MyComponent({ loading }) { if (loading) { return <Loading />; } return <p>Data loaded!</p>; }
function ErrorFallback() { return <p>Oops! Something went wrong.</p>; } function MyComponent({ error }) { if (error) { return <ErrorFallback />; } return <p>All good!</p>; }
function MyComponent({ loading, error }) { if (loading) return <p>Loading...</p>; if (error) return <p>Error occurred.</p>; return <p>Content is ready.</p>; }
This React component shows a loading message first. After 1.5 seconds, it either shows data or an error message. It uses fallback UI patterns to keep the user informed.
import React, { useState, useEffect } from 'react'; function Loading() { return <p aria-live="polite">Loading data, please wait...</p>; } function ErrorFallback() { return <p role="alert">Error loading data. Try again later.</p>; } function DataDisplay({ data }) { return <div> <h2>Data Loaded</h2> <pre>{JSON.stringify(data, null, 2)}</pre> </div>; } export default function App() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(false); useEffect(() => { setTimeout(() => { // Simulate fetch success or failure const success = true; if (success) { setData({ message: 'Hello from server!' }); setLoading(false); } else { setError(true); setLoading(false); } }, 1500); }, []); if (loading) return <Loading />; if (error) return <ErrorFallback />; return <DataDisplay data={data} />; }
Always provide accessible roles and aria-live for fallback messages to help screen reader users.
Keep fallback UI simple and clear to avoid confusing users.
Test fallback UI by simulating slow network or errors in your app.
Fallback UI patterns improve user experience during loading or errors.
Use simple conditional rendering to show fallback content.
Make fallback UI accessible and easy to understand.
Practice
Solution
Step 1: Understand fallback UI role
Fallback UI is used to improve user experience by showing temporary content during loading or errors.Step 2: Differentiate from permanent UI changes
Fallback UI is temporary, not a permanent replacement or disabling interaction.Final Answer:
To show a temporary interface while content is loading or an error occurs -> Option DQuick Check:
Fallback UI = temporary loading/error display [OK]
- Thinking fallback UI is permanent
- Confusing fallback UI with performance optimization
- Assuming fallback UI disables all user actions
Solution
Step 1: Review conditional rendering syntax
Using the ternary operator? :correctly chooses between fallback and main UI.Step 2: Check each option's logic
{isLoading ? <LoadingSpinner /> : <Content />}uses ternary correctly; B and C misuse logical operators; D uses assignment instead of comparison.Final Answer:
{isLoading ? <LoadingSpinner /> : <Content />} -> Option AQuick Check:
Ternary operator for fallback UI ={isLoading ? <LoadingSpinner /> : <Content />}[OK]
- Using && or || incorrectly for fallback UI
- Using assignment (=) instead of comparison
- Not providing both fallback and main UI in conditional
hasError is true?
function MyComponent({ hasError, isLoading }) {
if (hasError) {
return <div>Error occurred</div>
}
if (isLoading) {
return <div>Loading...</div>
}
return <div>Content loaded</div>
}Solution
Step 1: Check error condition first
The component returns the error message immediately ifhasErroris true.Step 2: Understand conditional order
Since error check comes before loading, loading state is ignored if error exists.Final Answer:
<div>Error occurred</div> -> Option BQuick Check:
Error condition renders error UI first [OK]
- Assuming loading shows even if error is true
- Ignoring order of conditions
- Thinking content loads despite error
function Profile({ user }) {
return (
<div>
{user ? <ProfileDetails user={user} /> : <LoadingSpinner />}
{!user && <LoadingSpinner />}
</div>
)
}Solution
Step 1: Analyze conditional rendering logic
The first condition showsLoadingSpinnerifuseris falsy.Step 2: Check second condition
The second condition showsLoadingSpinnerifuseris falsy, causing it to appear twice whenuseris falsy.Final Answer:
The fallback UI <LoadingSpinner /> is shown twice when user is null -> Option CQuick Check:
Duplicate fallback UI rendering due to conflicting conditions [OK]
- Assuming fallback UI shows only once
- Confusing truthy and falsy conditions
- Ignoring duplicated components in render
Solution
Step 1: Evaluate clarity and accessibility
Separate components for each state improve readability and accessibility.Step 2: Compare with other options
Nested ternaries (B) reduce readability; rendering all simultaneously (C) wastes resources; switch-case in JSX (D) is less common and can be confusing.Final Answer:
Use separate components for Loading, Error, and Content, and conditionally render them in order -> Option AQuick Check:
Separate components for fallback states = Use separate components for Loading, Error, and Content, and conditionally render them in order [OK]
- Using nested ternaries that are hard to read
- Rendering all states at once and hiding with CSS
- Using complex switch-case inside JSX
Ready to prove it?
Pass the test and this pattern moves unknown
