React Suspense की जानकारी
In this page:
<Suspense fallback={<p>Loading...</p>}>
<LazyComponent />
</Suspense>
Suspense क्या करता है
Suspense एक component को rendering pause करने और इसके बजाय एक fallback UI (जैसे एक spinner) दिखाने देता है, जब तक वह जिसका इंतज़ार कर रहा है ready न हो जाए। आज इसका सबसे common, stable use code-splitting के लिए React.lazy() है, जहां Suspense एक fallback दिखाता है जब तक component का code अभी भी download हो रहा हो।
उदाहरण: What Suspense Does
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const LazyComponent = React.lazy(() =>
Promise.resolve({ default: () => <p>I loaded (simulated lazy import)</p> })
);
function App() {
return (
<React.Suspense fallback={<p>Loading...</p>}>
<LazyComponent />
</React.Suspense>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
कई Suspending Children के लिए एक Fallback
एक single Suspense boundary एक साथ कई lazy-loaded (या otherwise suspending) children को wrap कर सकता है। Fallback तब दिखता है जब उनमें से कोई भी ready न हो, और actual content सिर्फ तभी दिखता है जब उन सबका loading खत्म हो जाए।
उदाहरण: One Fallback for Multiple Suspending Children
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const ComponentA = React.lazy(() => Promise.resolve({ default: () => <p>A loaded</p> }));
const ComponentB = React.lazy(() => Promise.resolve({ default: () => <p>B loaded</p> }));
function App() {
return (
<React.Suspense fallback={<p>Loading both...</p>}>
<ComponentA />
<ComponentB />
</React.Suspense>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
Suspense एक General Async Replacement नहीं है
Suspense किसी भी Promise या arbitrary async code के साथ automatically काम नहीं करता — इसे specifically इसके साथ integrate करने के लिए बना हुआ कुछ चाहिए, जैसे components के लिए React.lazy, या explicit Suspense support वाली एक data-fetching library।
useEffect के अंदर एक plain fetch() अपने आप suspend नहीं होता।
उदाहरण: Suspense Is Not a General Async Replacement
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
// This does NOT integrate with Suspense automatically:
function NormalFetcher() {
const [data, setData] = React.useState(null);
React.useEffect(() => { setData("loaded"); }, []);
return <p>{data || "loading (Suspense doesn't see this)"}</p>;
}
function App() {
return <React.Suspense fallback={<p>This fallback won't show for the above</p>}><NormalFetcher /></React.Suspense>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
- Regular data fetching के लिए Suspense उपयोग करने की कोशिश करना (जैसे useEffect में एक fetch() call) — यह उसके लिए नहीं बना जब तक बिना Suspense-compatible data library के।
- यह भूल जाना कि fallback prop required है — Suspense को यह जानना चाहिए कि इंतज़ार के दौरान क्या दिखाना है।
- यह न समझना कि Suspense सिर्फ उन चीज़ों के साथ काम करता है जो specifically suspend होने के लिए designed हैं (जैसे React.lazy या Suspense-enabled data libraries), arbitrary async code के साथ नहीं।
- Suspense एक component tree को एक fallback UI दिखाने देता है जब तक इसके अंदर कुछ ready न हो।
- सबसे common, stable use case React.lazy के साथ code-splitting है, एक chunk download होने के दौरान एक fallback दिखाना।
- Data fetching के लिए Suspense मौजूद है लेकिन इसे support करने के लिए specifically बनी एक library चाहिए (जैसे React Query या Relay का Suspense integration)।
- एक single Suspense boundary कई lazy/suspending children को wrap कर सकता है, एक shared fallback दिखाते हुए।
Lazy-loaded components के लिए Suspense React 16.6 से stable है; data fetching के लिए Suspense एक ज़्यादा recent, evolving feature है (React 18+)।
Chapter Quiz — Complete all 14 topics to unlock
0/14 topics done
Complete these topics first:
- Error Boundaries
- React Portals
- Modals using Portals (practical use)
- React Suspense
- Code Splitting with React.lazy
- Introduction to Server Components
- Introduction to Next.js (server-side React)
- Using React with TypeScript
- Scalable Folder Architecture
- Common React Design Patterns
- Component Documentation with Storybook
- Accessibility (a11y) in React
- i18n with react-i18next
- React Security Best Practices