Displaying Loading States and Placeholders
0 105
⏳ Displaying Loading States and Placeholders in React
In modern web apps, data fetching is often asynchronous — which means we need to handle “in-between” states while waiting. That’s where loading indicators and placeholders shine! They keep users informed and improve the overall experience. Let’s see how React handles this. ⚙️
❓ Why Loading States Matter
Imagine a user waiting for content and seeing nothing — they might think the app is broken! A good UI shows:
- ⏳ Spinners or skeletons while data loads
- ✅ Actual content when ready
- ❌ Fallback UI if something fails
🔧 Basic Loading State with useState
Let’s simulate a component fetching user data:
const [loading, setLoading] = useState(true);
const [user, setUser] = useState(null);
useEffect(() => {
setTimeout(() => {
setUser({ name: "John Doe" });
setLoading(false);
}, 2000); // Simulated delay
}, []);
✅ Displaying Loader vs. Content
return (
<div>
{loading ? (
<p>⏳ Loading user info...</p>
) : (
<p>👤 Welcome, {user.name}!</p>
)}
</div>
);
📌 This uses a ternary operator to toggle between loading and content. It’s clean, simple, and widely used.
💡 Alternative: Logical AND
{loading && <p>Loading...</p>}
{!loading && <p>User: {user.name}</p>}
Same logic, but written using short-circuit evaluation. Use whichever you find more readable! 👓
✨ Using Placeholders or Skeletons
Skeletons mimic the layout of your content and fade into the real UI when ready. You can build one manually:
{loading ? (
<div className="skeleton">
<div className="avatar-placeholder" />
<div className="text-line" />
</div>
) : (
<div>
<img src="avatar.jpg" />
<p>John Doe</p>
</div>
)}
Or use libraries like react-loading-skeleton for better visuals with less effort. 🎨
🛑 Handling Errors Too
Don’t forget to manage failed requests:
const [error, setError] = useState(false);
useEffect(() => {
fetch("/api/user")
.then(res => res.json())
.then(data => setUser(data))
.catch(() => setError(true))
.finally(() => setLoading(false));
}, []);
{loading && <p>Loading...</p>}
{error && <p>❌ Failed to load user.</p>}
{user && <p>👤 Hello, {user.name}</p>}
📦 Full Component Example
const UserCard = () => {
const [loading, setLoading] = useState(true);
const [user, setUser] = useState(null);
const [error, setError] = useState(false);
useEffect(() => {
setTimeout(() => {
const success = Math.random() > 0.2; // simulate 80% success rate
if (success) {
setUser({ name: "Jane Doe" });
} else {
setError(true);
}
setLoading(false);
}, 2000);
}, []);
if (loading) return <p>⏳ Fetching user data...</p>;
if (error) return <p>❌ Could not load user.</p>;
return <p>👋 Welcome, {user.name}!</p>;
};
🧠 Best Practices
- ✅ Always show a loader if async content takes more than 300ms
- ✅ Use skeletons for smoother user experience
- ✅ Handle both loading and error states for reliability
- 🔁 Optional: Show cached or stale data while updating in background
🧠 Recap
- Loading states help bridge the gap between user actions and data delivery
- Spinners, skeletons, and fallback UIs make your app feel faster and polished
- React’s conditional rendering makes it super easy to implement
Never leave your users staring at a blank screen. A good loader = a good impression! 🚀
🚀 What’s Next?
- 🔁 Learn about Suspense + lazy loading for code-splitting
- 🖼️ Create reusable skeleton components
- 📡 Add shimmer animations using external libraries
That’s it — now your app won’t just load; it’ll look smart while doing it! ✨
If you’re passionate about building a successful blogging website, check out this helpful guide at Coding Tag – How to Start a Successful Blog. It offers practical steps and expert tips to kickstart your blogging journey!
For dedicated UPSC exam preparation, we highly recommend visiting www.iasmania.com. It offers well-structured resources, current affairs, and subject-wise notes tailored specifically for aspirants. Start your journey today!

Share:
Comments
Waiting for your comments