← Back to React Course | Chapter 13: Advanced React & Architecture | Lesson 4 of 14

React Suspense की जानकारी

React Suspense एक 'please wait' sign जैसा है जिसे एक component अपने दरवाज़े पर टांग सकता है जब तक वह ready न हो, एक parent को blank room के बजाय एक अच्छा loading message दिखाने देते हुए।
Syntax
markup
<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 हो रहा हो।

Note: Suspense को सभी async handling के लिए एक general-purpose replacement के बजाय एक specialized, built-in loading-state mechanism के रूप में सोचें।
Warning: Suspense का fallback prop required है — इसके बिना, wrapped content ready न होने तक दिखाने के लिए कुछ भी नहीं है।

उदाहरण: What Suspense Does

markup
<!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 खत्म हो जाए।

Note: Related lazily-loaded pieces को एक Suspense boundary के तहत group करें जब आप चाहते हों कि वे एक साथ दिखें, बजाय इसके कि वे एक-एक करके pop हों।
Warning: अगर एक child बाकियों से कहीं ज़्यादा समय लेता है, तो पूरा group तब तक fallback पर रहता है जब तक सबसे slow वाला खत्म न हो जाए — अगर यह desired न हो तो separate boundaries consider करें।

उदाहरण: One Fallback for Multiple Suspending Children

markup
<!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 नहीं होता।

Note: बिना Suspense-compatible library के plain data fetching के लिए, इसके बजाय useFetch/useEffect tutorials के loading/error state patterns से चिपके रहें।
Warning: एक component को Suspense में wrap करना जो एक normal useEffect-based fetch करता है कुछ useful नहीं करता — Suspense उस fetch को detect या इसका इंतज़ार बिल्कुल नहीं करेगा।

उदाहरण: Suspense Is Not a General Async Replacement

markup
<!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>
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. Regular data fetching के लिए Suspense उपयोग करने की कोशिश करना (जैसे useEffect में एक fetch() call) — यह उसके लिए नहीं बना जब तक बिना Suspense-compatible data library के।
  2. यह भूल जाना कि fallback prop required है — Suspense को यह जानना चाहिए कि इंतज़ार के दौरान क्या दिखाना है।
  3. यह न समझना कि 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+)।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.