रिएक्ट डेवलपर्स के रूप में, हम अक्सर ऐसे परिदृश्यों का सामना करते हैं जहां कई तीव्र स्थिति परिवर्तनों को एपीआई के साथ सिंक्रनाइज़ करने की आवश्यकता होती है। हर छोटे बदलाव के लिए एपीआई कॉल करना अप्रभावी हो सकता है और क्लाइंट और सर्वर दोनों पर बोझ पड़ सकता है। यहीं पर उद्दंड और चतुर राज्य प्रबंधन काम आता है। इस लेख में, हम एक कस्टम रिएक्ट हुक बनाएंगे जो पेलोड को मर्ज करके और एपीआई कॉल को डिबाउंस करके समानांतर एपीआई अपडेट कॉल को कैप्चर करता है।
एक इनपुट फ़ील्ड की कल्पना करें जहां उपयोगकर्ता सेटिंग्स या प्राथमिकताओं को समायोजित कर सकें। प्रत्येक कीस्ट्रोक या समायोजन नई स्थिति को बचाने के लिए एक एपीआई कॉल को ट्रिगर कर सकता है। यदि कोई उपयोगकर्ता त्वरित उत्तराधिकार में कई परिवर्तन करता है, तो इससे एपीआई अनुरोधों की बाढ़ आ सकती है:
डिबाउंसिंग एक ऐसी तकनीक है जिसका उपयोग उस दर को सीमित करने के लिए किया जाता है जिस पर कोई फ़ंक्शन सक्रिय हो सकता है। फ़ंक्शन को तुरंत कॉल करने के बजाय, आप इसे निष्पादित करने से पहले निष्क्रियता की एक निश्चित अवधि की प्रतीक्षा करते हैं। यदि विलंब समाप्त होने से पहले कोई अन्य कॉल आती है, तो टाइमर रीसेट हो जाता है।
रिएक्ट में, यूज़रेफ एक हुक है जो आपको री-रेंडर को ट्रिगर किए बिना रेंडरर्स के बीच परिवर्तनशील मानों को जारी रखने की अनुमति देता है। यह अनिवार्य रूप से एक कंटेनर है जो परिवर्तनशील मूल्य रखता है।
आइए कोड में गहराई से उतरें और समझें कि यह सब एक साथ कैसे आता है।
import { debounce } from "@mui/material"; import { useCallback, useEffect, useRef } from "react"; type DebouncedUpdateParams = { id: string; params: Record; }; function useDebouncedUpdate( apiUpdate: (params: DebouncedUpdateParams) => void, delay: number = 300, ) { const accumulatedUpdates = useRef (null); const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current; const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], ); useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]); return handleUpdate; } export default useDebouncedUpdate;
हम सभी आने वाले अपडेट के संयुक्त मापदंडों को संग्रहीत करने के लिए एक यूज़रेफ को इनिशियलाइज़ करते हैं जिसे एक्युम्युलेटअपडेट्स कहा जाता है।
स्थिरांकित अद्यतन = उपयोगRef
हम सामग्री यूआई से डिबाउंस उपयोगिता का उपयोग करके एक डिबाउंस फ़ंक्शन प्रोसेसअपडेट बनाते हैं।
const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current;
हैंडलअपडेट फ़ंक्शन अपडेट जमा करने और डिबाउंस एपीआई कॉल को ट्रिगर करने के लिए जिम्मेदार है।
const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], );
जब घटक मेमोरी लीक को रोकने के लिए अनमाउंट होता है तो हम डिबाउंस्ड फ़ंक्शन को साफ़ कर देते हैं।
useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]);
यहां बताया गया है कि आप इस हुक का उपयोग किसी घटक में कैसे कर सकते हैं:
import React from "react"; import useDebouncedUpdate from "./useDebouncedUpdate"; function SettingsComponent() { const debouncedUpdate = useDebouncedUpdate(updateSettingsApi, 500); const handleChange = (settingName, value) => { debouncedUpdate({ id: "user-settings", params: { [settingName]: value }, }); }; return (handleChange("username", e.target.value)} /> handleChange("notifications", e.target.checked)} />); } function updateSettingsApi({ id, params }) { // Make your API call here console.log("Updating settings:", params); }
राज्य संचय के साथ डिबाउंसिंग को जोड़कर, हम कुशल और उत्तरदायी एप्लिकेशन बना सकते हैं। यूज़डिबाउंस्डअपडेट हुक यह सुनिश्चित करता है कि तेजी से बदलाव एक साथ बैच किए जाएं, अनावश्यक एपीआई कॉल कम हो जाएं और प्रदर्शन में सुधार हो।
चाबी छीनना:
बेझिझक इस हुक को अपनी परियोजनाओं में एकीकृत करें और इसे अपनी विशिष्ट आवश्यकताओं के अनुरूप समायोजित करें। हैप्पी कोडिंग!
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3