why we need suspense component in react
You can manage loading states using useState
and useEffect
, and this is a common practice in React applications. However, Suspense
provides several unique advantages and simplifications over the traditional use of useState
and useEffect
. Here’s why you might prefer to use Suspense
:
1. Separation of Concerns
With Suspense
, you can separate the logic of data fetching and UI presentation more cleanly. This separation makes your components simpler and more focused on their primary purpose (rendering UI) rather than handling multiple responsibilities.
Without Suspense:
import React, { useState, useEffect } from 'react';
const DataComponent = () => {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetchData().then(response => {
setData(response);
setLoading(false);
});
}, []);
if (loading) {
return <div>Loading...</div>;
}
return <div>{data}</div>;
};
export default DataComponent;
With Suspense:
import React, { Suspense } from 'react';
const DataComponent = React.lazy(() => fetchData().then(data => ({ default: () => <div>{data}</div> })));
const App = () => {
return (
<Suspense fallback={<div>Loading...</div>}>
<DataComponent />
</Suspense>
);
};
export default App;
2. Declarative Data Fetching
Suspense
enables a more declarative approach to handling loading states. This can make your components easier to read and maintain, as the loading state management is abstracted away.
3. Consistency Across Components
Using Suspense
, you can have a consistent way to handle loading states across multiple components without duplicating loading state logic in each component. This reduces boilerplate and ensures a consistent user experience.
4. Concurrent Rendering
Suspense
is a key feature for enabling concurrent rendering in React. Concurrent rendering allows React to interrupt and resume work on components, making the UI more responsive and improving performance in complex applications. Managing these states manually with useState
and useEffect
is much more complex and error-prone.
5. Simplified Code Splitting
Suspense
works seamlessly with React.lazy
for code splitting, allowing you to load components only when they are needed. This helps in reducing the initial bundle size and improving load times.
Example with Suspense
and React.lazy
:
Lazy Loading a Component:
import React, { Suspense, lazy } from 'react';
const LazyComponent = lazy(() => import('./LazyComponent'));
const App = () => {
return (
<div>
<h1>My App</h1>
<Suspense fallback={<div>Loading...</div>}>
<LazyComponent />
</Suspense>
</div>
);
};
export default App;