Unlock the Power of React Suspense: Get Ready to Enhance Your User Experience!

Shuvam Kumar
4 min readDec 3, 2022

--

React Suspense is a new feature in React that allows components to “suspend” rendering until something else has loaded. This is especially useful for loading asynchronous data, such as images or data from an API. Suspense can also be used for fallback loading states, such as a loading spinner.

import React, { Suspense } from "react";
const Image = React.lazy(() => import("./Image"));
const App = () => {
return (
<div>
<Suspense fallback={<div>Loading…</div>}>
<Image src="image.jpg" alt="example image" />{" "}
</Suspense>{" "}
</div>
);
};
export default App;

In this example, the Image component is being loaded using React.lazy(). This tells React that the component should be loaded asynchronously, and React Suspense will handle the loading state. The fallback prop is used to display a loading spinner or other content while the component is being loaded. Once the component is ready, it will be rendered in place of the fallback.

How exactly user-experience is enhanced 🤔?

React Suspense allows developers to create components that can suspend rendering while they load data. This can improve user experience by allowing users to continue interacting with the application while data is being fetched, rather than having to wait for all data to be loaded before they can do anything.

For example, imagine a social media app that displays a feed of posts. Without React Suspense, the user would have to wait for all of the posts to be loaded before they could start scrolling or interacting with the feed. With React Suspense, the user could start scrolling and interacting with the feed immediately, and the posts would be loaded as they are needed. This would provide a much smoother and more responsive user experience.

Additionally, React Suspense allows developers to show a loading indicator or placeholder content while data is being fetched, rather than displaying nothing at all. This can make the application feel more responsive and provide the user with feedback about what is happening.

Is there any disadvantage to using React Suspense?

React Suspense is a relatively new feature, and it is still being developed and refined. As such, it may not be as stable or well-supported as other parts of the React ecosystem.

Additionally, using React Suspense effectively requires a different approach to data fetching and rendering than traditional techniques. This may require developers to learn new concepts and practices, which could be a disadvantage if they are already familiar with other approaches.

Furthermore, React Suspense only works with asynchronous data fetching, and it relies on throwing and catching promises to suspend and resume rendering. This can add complexity to the code and make it more difficult to debug and maintain.

Overall, the disadvantages of React Suspense largely stem from its novelty and the fact that it requires a different approach to data fetching and rendering. However, as the feature continues to evolve and improve, these disadvantages may become less significant.

A practical and fun implementation of React Suspense:

One fun example of using React Suspense could be to create a virtual pet that the user can interact with. The pet could be a simple 2D character that the user can feed, play with, and take care of.

Here’s how the application could be implemented using React Suspense:

import React, { Suspense } from 'react';

const Pet = () => {
// Declare state variables for the pet's hunger, happiness, and image
const [hunger, setHunger] = useState(50);
const [happiness, setHappiness] = useState(50);
const [image, setImage] = useState(null);

// Use the useEffect hook to load the pet's image
useEffect(() => {
// Start an asynchronous operation to load the pet's image
const loadImage = async () => {
const response = await fetch('https://my-api.com/pet-image.png');
const imageData = await response.blob();
setImage(URL.createObjectURL(imageData));
};

// Start loading the image
loadImage();
}, []);

// If the pet's image hasn't been loaded yet, suspend rendering
if (!image) throw new Promise(() => {});

// Return the pet's image and buttons for interacting with the pet
return (
<div>
<img src={image} alt="Pet" />
<p>Hunger: {hunger}</p>
<p>Happiness: {happiness}</p>
<button onClick={() => setHunger(hunger - 10)}>Feed</button>
<button onClick={() => setHappiness(happiness + 10)}>Play</button>
</div>
);
};

const App = () => (
<Suspense fallback={<div>Loading pet...</div>}>
<Pet />
</Suspense>
);

In this example, the Pet component loads its image using the useEffect hook. While the image is being loaded, the Pet component suspends rendering by throwing a promise. The parent Suspense component catches the promise and renders a loading indicator instead. Once the image has been loaded, the Pet component resumes rendering and displays the image, along with buttons for interacting with the pet.

This example demonstrates how React Suspense can be used to create a more engaging and responsive user experience, by allowing the user to interact with the virtual pet while its image is being loaded.

Overall, React Suspense is a promising addition to the React ecosystem, and it has the potential to greatly enhance the user experience of applications that make use of it. As the feature continues to evolve and improve, it will be interesting to see how it is adopted and used by developers.

--

--

Shuvam Kumar
Shuvam Kumar

No responses yet