रिएक्ट का use: रिसोर्स हुक: एक विस्तृत गाइड | MLOG | MLOG
हिन्दी
कुशल डेटा फ़ेचिंग और रिसोर्स मैनेजमेंट के लिए रिएक्ट के use: रिसोर्स हुक में महारत हासिल करें। सर्वोत्तम प्रथाओं, उन्नत तकनीकों और वास्तविक दुनिया के उदाहरणों को जानें।
रिएक्ट का use: रिसोर्स हुक: एक विस्तृत गाइड
रिएक्ट में use: हुक आपके कंपोनेंट्स के भीतर सीधे रिसोर्स लोडिंग और डेटा फ़ेचिंग को संभालने का एक शक्तिशाली और डिक्लेरेटिव तरीका प्रदान करता है। यह आपको तब तक रेंडरिंग को सस्पेंड करने की अनुमति देता है जब तक कोई रिसोर्स उपलब्ध न हो, जिससे बेहतर यूजर एक्सपीरियंस और सरल डेटा मैनेजमेंट होता है। यह गाइड use: हुक को विस्तार से समझाएगा, जिसमें इसके मूल सिद्धांत, उन्नत उपयोग के मामले और सर्वोत्तम प्रथाएं शामिल हैं।
use: हुक क्या है?
use: हुक एक विशेष रिएक्ट हुक है जिसे सस्पेंस के साथ एकीकरण के लिए डिज़ाइन किया गया है। सस्पेंस एक ऐसा मैकेनिज्म है जो कंपोनेंट्स को रेंडरिंग से पहले किसी चीज़ का "इंतजार" करने देता है, जैसे कि एपीआई से डेटा। use: हुक कंपोनेंट्स को सीधे एक प्रॉमिस या अन्य रिसोर्स को "पढ़ने" की अनुमति देता है, जिससे कंपोनेंट तब तक सस्पेंड हो जाता है जब तक कि रिसोर्स हल या उपलब्ध न हो जाए। यह दृष्टिकोण useEffect और स्टेट मैनेजमेंट लाइब्रेरी जैसे पारंपरिक तरीकों की तुलना में एसिंक्रोनस ऑपरेशनों को संभालने का एक अधिक डिक्लेरेटिव और कुशल तरीका बढ़ावा देता है।
use: का उपयोग क्यों करें?
यहाँ बताया गया है कि आपको use: हुक का उपयोग करने पर क्यों विचार करना चाहिए:
सरल डेटा फ़ेचिंग: डेटा फ़ेचिंग के लिए मैन्युअल स्टेट मैनेजमेंट और useEffect कॉल की आवश्यकता को समाप्त करता है।
डिक्लेरेटिव दृष्टिकोण: कंपोनेंट के भीतर सीधे डेटा निर्भरता को स्पष्ट रूप से व्यक्त करता है।
बेहतर यूजर एक्सपीरियंस: सस्पेंस स्मूथ ट्रांज़िशन और लोडिंग स्टेट्स सुनिश्चित करता है।
बेहतर परफॉर्मेंस: अनावश्यक री-रेंडर को कम करता है और रिसोर्स लोडिंग को ऑप्टिमाइज़ करता है।
कोड पठनीयता: कंपोनेंट लॉजिक को सरल बनाता है और रखरखाव को बढ़ाता है।
use: के मूल सिद्धांत
बुनियादी उपयोग
use: हुक एक प्रॉमिस (या कोई भी 'thenable' ऑब्जेक्ट) को अपने तर्क के रूप में लेता है और प्रॉमिस का हल किया गया मान लौटाता है। यदि प्रॉमिस अभी भी पेंडिंग है, तो कंपोनेंट सस्पेंड हो जाता है। यहाँ एक सरल उदाहरण है:
उदाहरण 1: डेटा फ़ेच करना और प्रदर्शित करना
मान लीजिए कि हम एक एपीआई से उपयोगकर्ता डेटा फ़ेच करना चाहते हैं और उसे प्रदर्शित करना चाहते हैं। हम use: का उपयोग इस प्रकार कर सकते हैं:
रिसोर्स बनाना (फ़ेचर फ़ंक्शन)
सबसे पहले, डेटा फ़ेच करने के लिए एक फ़ंक्शन बनाएं। यह फ़ंक्शन एक प्रॉमिस लौटाएगा:
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
एक कंपोनेंट में use: का उपयोग करना
import React, { Suspense } from 'react';
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
function UserProfile({ userId }) {
const user = React.use(fetchUser(userId));
return (
{user.name}
Email: {user.email}
Phone: {user.phone}
);
}
function App() {
return (
Loading user data...
}>
);
}
export default App;
इस उदाहरण में:
fetchUser एक एसिंक्रोनस फ़ंक्शन है जो एक एपीआई एंडपॉइंट से उपयोगकर्ता डेटा फ़ेच करता है।
UserProfile कंपोनेंट उपयोगकर्ता डेटा फ़ेच करने के लिए React.use(fetchUser(userId)) का उपयोग करता है।
Suspense कंपोनेंट UserProfile कंपोनेंट को रैप करता है और एक fallback प्रॉप प्रदान करता है जो डेटा फ़ेच होने के दौरान प्रदर्शित होता है।
यदि डेटा अभी तक उपलब्ध नहीं है, तो रिएक्ट UserProfile कंपोनेंट को सस्पेंड कर देगा और फॉलबैक यूआई ("Loading user data..." संदेश) प्रदर्शित करेगा। एक बार डेटा फ़ेच हो जाने के बाद, UserProfile कंपोनेंट उपयोगकर्ता डेटा के साथ रेंडर होगा।
उदाहरण 2: त्रुटियों को संभालना
use: हुक प्रॉमिस द्वारा फेंकी गई त्रुटियों को स्वचालित रूप से संभालता है। यदि कोई त्रुटि होती है, तो कंपोनेंट सस्पेंड हो जाएगा और निकटतम एरर बाउंड्री त्रुटि को पकड़ लेगी।
import React, { Suspense } from 'react';
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
function UserProfile({ userId }) {
const user = React.use(fetchUser(userId));
return (
}>
{/* Assuming this ID doesn't exist and will cause an error */}
);
}
export default App;
इस उदाहरण में, यदि fetchUser फ़ंक्शन एक त्रुटि फेंकता है (उदाहरण के लिए, 404 स्थिति के कारण), तो ErrorBoundary कंपोनेंट त्रुटि को पकड़ लेगा और फॉलबैक यूआई प्रदर्शित करेगा। फॉलबैक कोई भी रिएक्ट कंपोनेंट हो सकता है, जैसे कि एक त्रुटि संदेश या पुनः प्रयास बटन।
use: के साथ उन्नत तकनीकें
1. रिसोर्सेज को कैश करना
अनावश्यक फ़ेचिंग से बचने के लिए, आप रिसोर्स (प्रॉमिस) को कैश कर सकते हैं और इसे कई कंपोनेंट्स या रेंडर में पुनः उपयोग कर सकते हैं। यह ऑप्टिमाइज़ेशन परफॉर्मेंस के लिए महत्वपूर्ण है।
import React, { Suspense, useRef } from 'react';
const resourceCache = new Map();
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
function getUserResource(userId) {
if (!resourceCache.has(userId)) {
resourceCache.set(userId, {
read() {
if (!this.promise) {
this.promise = fetchUser(userId);
}
if (this.result) {
return this.result;
}
throw this.promise;
}
});
}
return resourceCache.get(userId);
}
function UserProfile({ userId }) {
const resource = getUserResource(userId);
const user = resource.read();
return (
{user.name}
Email: {user.email}
Phone: {user.phone}
);
}
function App() {
return (
Loading user data...
}>
);
}
export default App;
इस उदाहरण में:
हम विभिन्न यूजर आईडी के लिए प्रॉमिस को स्टोर करने के लिए एक resourceCache मैप का उपयोग करते हैं।
getUserResource फ़ंक्शन जांचता है कि किसी दिए गए यूजर आईडी के लिए कोई प्रॉमिस पहले से ही कैश में मौजूद है या नहीं। यदि यह मौजूद है, तो यह कैश्ड प्रॉमिस लौटाता है। यदि नहीं, तो यह एक नया प्रॉमिस बनाता है, इसे कैश में संग्रहीत करता है, और इसे लौटाता है।
यह सुनिश्चित करता है कि हम उपयोगकर्ता डेटा केवल एक बार फ़ेच करते हैं, भले ही UserProfile कंपोनेंट एक ही यूजर आईडी के साथ कई बार रेंडर हो।
2. सर्वर कंपोनेंट्स के साथ use: का उपयोग करना
use: हुक रिएक्ट सर्वर कंपोनेंट्स में विशेष रूप से उपयोगी है, जहां डेटा फ़ेचिंग सीधे सर्वर पर की जा सकती है। इसके परिणामस्वरूप तेज़ प्रारंभिक पेज लोड और बेहतर एसईओ होता है।
Next.js सर्वर कंपोनेंट के साथ उदाहरण
// app/user/[id]/page.jsx (Server Component in Next.js)
import React from 'react';
async function fetchUser(id) {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`);
if (!response.ok) {
throw new Error(`Failed to fetch user: ${response.status}`);
}
return response.json();
}
export default async function UserPage({ params }) {
const user = React.use(fetchUser(params.id));
return (
{user.name}
Email: {user.email}
Phone: {user.phone}
);
}
इस Next.js सर्वर कंपोनेंट में, fetchUser फ़ंक्शन सर्वर पर उपयोगकर्ता डेटा फ़ेच करता है। use: हुक कंपोनेंट को तब तक सस्पेंड करता है जब तक डेटा उपलब्ध न हो, जिससे कुशल सर्वर-साइड रेंडरिंग संभव हो पाती है।
use: के लिए सर्वोत्तम प्रथाएं
रिसोर्सेज कैश करें: अनावश्यक फ़ेचिंग से बचने के लिए हमेशा अपने रिसोर्सेज को कैश करें। इस उद्देश्य के लिए useRef या एक ग्लोबल कैश का उपयोग करें।
त्रुटियों को संभालें: लोडिंग स्टेट्स और त्रुटियों को शालीनता से संभालने के लिए अपने कंपोनेंट्स को Suspense और एरर बाउंड्री के साथ रैप करें।
सर्वर कंपोनेंट्स के साथ उपयोग करें: डेटा फ़ेचिंग को ऑप्टिमाइज़ करने और एसईओ में सुधार करने के लिए सर्वर कंपोनेंट्स में use: का लाभ उठाएं।
ओवर-फ़ेचिंग से बचें: नेटवर्क ओवरहेड को कम करने के लिए केवल आवश्यक डेटा फ़ेच करें।
सस्पेंस बाउंड्री को ऑप्टिमाइज़ करें: अपनी एप्लिकेशन के बड़े हिस्सों को सस्पेंड करने से बचने के लिए सस्पेंस बाउंड्री को रणनीतिक रूप से रखें।
ग्लोबल एरर हैंडलिंग: अप्रत्याशित त्रुटियों को पकड़ने और एक सुसंगत यूजर एक्सपीरियंस प्रदान करने के लिए ग्लोबल एरर बाउंड्री लागू करें।
वास्तविक दुनिया के उदाहरण
1. ई-कॉमर्स उत्पाद सूची
एक ई-कॉमर्स वेबसाइट की कल्पना करें जो उत्पाद सूचियों को प्रदर्शित करती है। प्रत्येक उत्पाद कार्ड उत्पाद विवरण फ़ेच करने के लिए use: का उपयोग कर सकता है:
// ProductCard.jsx
import React, { Suspense } from 'react';
async function fetchProduct(productId) {
const response = await fetch(`/api/products/${productId}`);
if (!response.ok) {
throw new Error(`Failed to fetch product: ${response.status}`);
}
return response.json();
}
function ProductCard({ productId }) {
const product = React.use(fetchProduct(productId));
return (
{product.name}
{product.description}
Price: ${product.price}
);
}
function ProductList({ productIds }) {
return (
यह दृष्टिकोण सुनिश्चित करता है कि प्रत्येक उत्पाद कार्ड स्वतंत्र रूप से लोड होता है, और धीमी गति से लोड होने वाले उत्पादों द्वारा समग्र पेज रेंडरिंग अवरुद्ध नहीं होती है। उपयोगकर्ता प्रत्येक उत्पाद के लिए अलग-अलग लोडिंग इंडिकेटर देखता है, जिससे बेहतर अनुभव मिलता है।
2. सोशल मीडिया फ़ीड
एक सोशल मीडिया फ़ीड उपयोगकर्ता प्रोफाइल, पोस्ट और टिप्पणियों को फ़ेच करने के लिए use: का उपयोग कर सकता है:
// Post.jsx
import React, { Suspense } from 'react';
async function fetchPost(postId) {
const response = await fetch(`/api/posts/${postId}`);
if (!response.ok) {
throw new Error(`Failed to fetch post: ${response.status}`);
}
return response.json();
}
async function fetchComments(postId) {
const response = await fetch(`/api/posts/${postId}/comments`);
if (!response.ok) {
throw new Error(`Failed to fetch comments: ${response.status}`);
}
return response.json();
}
function Comments({ postId }) {
const comments = React.use(fetchComments(postId));
return (
{comments.map((comment) => (
{comment.text}
))}
);
}
function Post({ postId }) {
const post = React.use(fetchPost(postId));
return (
{post.title}
{post.content}
Loading comments...
}>
);
}
export default Post;
यह उदाहरण पोस्ट सामग्री और टिप्पणियों को स्वतंत्र रूप से लोड करने के लिए नेस्टेड सस्पेंस बाउंड्री का उपयोग करता है। उपयोगकर्ता पोस्ट सामग्री देख सकता है जबकि टिप्पणियां अभी भी लोड हो रही हैं।
सामान्य गलतियाँ और उनसे कैसे बचें
रिसोर्सेज को कैश न करना: रिसोर्सेज को कैश करना भूलने से परफॉर्मेंस संबंधी समस्याएं हो सकती हैं। हमेशा useRef या एक ग्लोबल कैश जैसे कैशिंग मैकेनिज्म का उपयोग करें।
ओवर-सस्पेंशन: एप्लिकेशन के बड़े हिस्सों को सस्पेंड करने से एक खराब यूजर एक्सपीरियंस हो सकता है। सस्पेंस बाउंड्री को रणनीतिक रूप से रखें।
त्रुटियों को अनदेखा करना: त्रुटियों को संभालने की उपेक्षा करने से अप्रत्याशित व्यवहार हो सकता है। त्रुटियों को पकड़ने और शालीनता से संभालने के लिए हमेशा एरर बाउंड्री का उपयोग करें।
गलत एपीआई उपयोग: सुनिश्चित करें कि आपके एपीआई एंडपॉइंट विश्वसनीय हैं और अपेक्षित प्रारूप में डेटा लौटाते हैं।
अनावश्यक री-रेंडर:React.memo का उपयोग करके और अपने कंपोनेंट के रेंडर लॉजिक को ऑप्टिमाइज़ करके अनावश्यक री-रेंडर से बचें।
use: के विकल्प
हालांकि use: महत्वपूर्ण लाभ प्रदान करता है, रिएक्ट में डेटा फ़ेचिंग के लिए वैकल्पिक दृष्टिकोण भी हैं:
useEffect स्टेट के साथ: डेटा फ़ेच करने और इसे स्टेट में संग्रहीत करने के लिए useEffect का उपयोग करने वाला पारंपरिक दृष्टिकोण। यह विधि अधिक वर्बोस है और इसके लिए मैन्युअल स्टेट मैनेजमेंट की आवश्यकता होती है।
useSWR: रिमोट डेटा फ़ेचिंग के लिए एक लोकप्रिय रिएक्ट हुक लाइब्रेरी। useSWR कैशिंग, पुनर्वैधीकरण और त्रुटि प्रबंधन जैसी सुविधाएँ प्रदान करता है।
रिएक्ट क्वेरी से useQuery: एसिंक्रोनस डेटा के प्रबंधन के लिए एक और शक्तिशाली लाइब्रेरी। रिएक्ट क्वेरी बैकग्राउंड अपडेट, ऑप्टिमिस्टिक अपडेट और स्वचालित पुनः प्रयास जैसी उन्नत सुविधाएँ प्रदान करती है।
Relay: डेटा-संचालित रिएक्ट एप्लिकेशन बनाने के लिए एक जावास्क्रिप्ट फ्रेमवर्क। रिले डेटा फ़ेचिंग और प्रबंधन के लिए एक डिक्लेरेटिव दृष्टिकोण प्रदान करता है।
इन विकल्पों के बीच का चुनाव आपकी एप्लिकेशन की जटिलता और आपकी विशिष्ट आवश्यकताओं पर निर्भर करता है। सरल डेटा फ़ेचिंग परिदृश्यों के लिए, use: एक बढ़िया विकल्प हो सकता है। अधिक जटिल परिदृश्यों के लिए, useSWR या रिएक्ट क्वेरी जैसी लाइब्रेरी अधिक उपयुक्त हो सकती हैं।
निष्कर्ष
रिएक्ट में use: हुक रिसोर्स लोडिंग और डेटा फ़ेचिंग को संभालने का एक शक्तिशाली और डिक्लेरेटिव तरीका प्रदान करता है। सस्पेंस के साथ use: का लाभ उठाकर, आप अपने कंपोनेंट लॉजिक को सरल बना सकते हैं, यूजर एक्सपीरियंस में सुधार कर सकते हैं, और परफॉर्मेंस को ऑप्टिमाइज़ कर सकते हैं। इस गाइड ने आपके रिएक्ट एप्लिकेशनों में use: का उपयोग करने के लिए मूल सिद्धांतों, उन्नत तकनीकों और सर्वोत्तम प्रथाओं को कवर किया है। इन दिशानिर्देशों का पालन करके, आप एसिंक्रोनस ऑपरेशनों को प्रभावी ढंग से प्रबंधित कर सकते हैं और मजबूत, प्रदर्शनकारी और उपयोगकर्ता-अनुकूल एप्लिकेशन बना सकते हैं। जैसे-जैसे रिएक्ट विकसित हो रहा है, use: जैसी तकनीकों में महारत हासिल करना आगे रहने और असाधारण यूजर एक्सपीरियंस देने के लिए आवश्यक हो जाता है।