उपयोगमेमो या यूज़बैक कॉलबैक वीएस उपयोग के साथ खाली निर्भरता


10

इस GitHub मुद्दे में मैंने अनिवार्य रूप से बदलाव का प्रस्ताव दिया:

x = useCallback( ... , []);

सेवा:

x = useRef( ... ).current;

दो समान हैं लेकिन useRefरिएक्ट निर्भरता की तुलना नहीं करता है।

जिसके लिए एक प्रश्न का उत्तर आया:

क्या कभी ऐसी स्थिति है जहां एक निर्भरता-कम उपयोग मेमो या यूज़कैलबैक उपयोग से बेहतर विकल्प होगा?

मैं एक के बारे में नहीं सोच सकता, लेकिन मैंने कुछ उपयोग-मामलों की अनदेखी की होगी।

तो क्या कोई ऐसी स्थिति के बारे में सोच सकता है?

जवाबों:


5

प्रति प्रतिक्रिया हुक एपीआई प्रलेखन:

ध्यान रखें कि जब इसकी सामग्री बदलती है तो useRef आपको सूचित नहीं करता है। .Current संपत्ति को म्यूट करने से पुन: रेंडर नहीं होता है ... कॉलबैक रेफरी का उपयोग यह सुनिश्चित करता है कि भले ही एक बच्चा घटक मापा नोड को बाद में प्रदर्शित करता है (जैसे एक क्लिक के जवाब में), हम अभी भी माता-पिता में इसके बारे में सूचित करते हैं घटक और माप अद्यतन कर सकते हैं।

आप इसके बारे में यहाँ और यहाँ पढ़ सकते हैं ।


मुझे लगता है कि यह सवाल का जवाब देता है, लेकिन मुझे संदेह है कि यह गलत है। सैंडबॉक्स रिएक्ट उदाहरण में, समान कार्य useCallback(x,[])करने के लिए बदल रहा है useRef(x)
इज़्हाकी

useRef(x).currentअर्थात्।
इज़्हाकी

मुझे आशा है कि मैं गलत हूं, लेकिन मैंने इस बात के लिए एक मामला बनाया है कि डॉक्स गलत क्यों हैं: github.com/reactjs/reactjs.org/issues/2570
Izhaki

मैं पूरी तरह यकीन नहीं कर रहा हूँ के बारे में useCallback(cb, [])बनाम useRef(cb).currentअपने आप को। हालाँकि, इस अर्थ में useMemo(cb, [])अलग useRef(cb).currentहै कि useMemo, "केवल याद किए गए मूल्य को फिर से बढ़ाना होगा जब निर्भरता में से एक बदल गया हो।" वर्सस useRefजो हमेशा मान को बनाए रखता है चाहे वह कोई भी हो।
इरासुना

useRefकभी नहीं recomputes - यह हमेशा प्रारंभिक मूल्य लौटाता है।
इजाकी

1

जब आप उपयोग का उपयोग कर सकते हैं। उपयोग को वापस लेने के लिए उपयोग करें या खाली निर्भरता के साथ, आप इसे उपयोग नहीं कर सकते हैं उपयोग के सभी संभावित परिदृश्यों के लिए जो किसी भी निर्भरता में परिवर्तन होने पर रिमूव करना है।

इसके अलावा, यदि आप इसका उपयोग useCallback with empty dependencyया उपयोग करते हैं, तो इससे बहुत अधिक प्रदर्शन अंतर नहीं होगा क्योंकि इसमें कोई भारी तुलना नहीं करनी है।

यदि आप फ़ंक्शन कार्यान्वयन को थोड़ा बदलते हैं, ताकि आपको इसे किसी विशेष परम परिवर्तन पर फिर से बनाना पड़े, तो आप बस कार्यान्वयन useCallbackको अतिरिक्त परम में निर्भरता के साथ जोड़ सकते हैं। हालाँकि यदि आप इसे useRef के साथ कार्यान्वित करते हैं, तो आपको वापस लौटना होगाuseCallback


1
धन्यवाद। जैसा कि शीर्षक से पता चलता है, यह कड़ाई से खाली निर्भरता का मामला है।
इज़्हाकी

1
@ इज़हाकी मैं समझता हूं कि आप सवाल कड़ाई से खाली निर्भरता है और यही कारण है कि मैंने उल्लेख किया है कि खाली निर्भरता के मामले में कोई अंतर नहीं है। लेकिन इसके जब आप अधिक बदलावों को जोड़ने की कोशिश करते हैं, तो आपको काफी रिफ्लेक्टर की आवश्यकता हो सकती है
शुभम खत्री

0

क्योंकि useRef (() => {...}) का आउटपुट उत्परिवर्तनीय है।

जो आपके कोड में अजीब दुष्प्रभाव पैदा कर सकता है। मैं किसी भी समय करंट का मान बदल सकता हूं। https://codesandbox.io/s/confident-monad-vjeuw

यह उपयोग करने के लिए उपयोग नहीं करना चाहते के लिए usecase होगा


1
लेकिन x = useRef(value).currentएक उत्परिवर्ती उदाहरण कभी नहीं लौटाता - refकभी वापस नहीं किया जाता; currentहै। यह useCallbackसंस्करण के साथ ही है ।
इजाकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.