कस्टम रेफरी बनाम React.forwardRef का उपयोग करने का मूल्य


13

मैं देख रहा हूं कि React.forwardRef को प्रतिक्रियाशील अवधि से, बाल कार्यात्मक घटक में रेफ को पास करने का स्वीकृत तरीका लगता है:

const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="FancyButton">
    {props.children}
  </button>
));

// You can now get a ref directly to the DOM button:
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;

हालांकि, केवल एक कस्टम प्रोप पास करने पर यह करने का क्या फायदा है ?:

const FancyButton = ({ innerRef }) => (
  <button ref={innerRef} className="FancyButton">
    {props.children}
  </button>
));

const ref = React.createRef();
<FancyButton innerRef={ref}>Click me!</FancyButton>;

केवल एक ही लाभ जिसके बारे में मैं सोच सकता हूं कि वह रेफ के लिए लगातार एपीआई कर रहा है, लेकिन क्या कोई और फायदा है? जब यह प्रतिपादन करने के लिए आता है और निश्चित रूप से अतिरिक्त रेंडर करने का कारण बनता है, तो क्या कस्टम प्रोप को अलग करना प्रभावित करता है, क्योंकि निश्चित रूप से रेफ को currentक्षेत्र में उत्परिवर्तित अवस्था के रूप में संग्रहीत नहीं किया जाता है ?

उदाहरण के लिए कहें कि आप कई रेफल्स पास करना चाहते थे (जो tbh हो सकता है, कोड गंध का संकेत दे सकता है, लेकिन फिर भी), तो एकमात्र समाधान जो मैं देख सकता हूं वह है customRef props का उपयोग करना।

मुझे लगता है कि मेरा सवाल है कि forwardRefएक कस्टम प्रोप से अधिक का उपयोग करने का मूल्य क्या है ?

जवाबों:


3

यहां तक ​​कि रिएक्ट डॉक्स में अधिक लचीले दृष्टिकोण के रूप में कस्टम रेफरी प्रोप का उल्लेख है forwardRef:

यदि आप React 16.2 या उससे कम का उपयोग करते हैं, या यदि आपको रेफरल फॉरवर्डिंग की तुलना में अधिक लचीलेपन की आवश्यकता है, तो आप इस वैकल्पिक दृष्टिकोण का उपयोग कर सकते हैं और स्पष्ट रूप से एक अलग नाम वाले प्रोप के रूप में एक रेफ पास कर सकते हैं ।

एक सार भी है , जिसमें दान अब्रामोव इसके फायदे के बारे में लिखते हैं:

  • सभी रिएक्ट संस्करणों के साथ संगत
  • वर्ग और फ़ंक्शन घटकों के लिए काम करता है
  • एक नेस्टेड घटक के लिए रेफरी पासिंग को कई परतों को सरल करता है

मैं जोड़ूंगा, कि सामान्य प्रॉप्स के रूप में रीफ्स गुजरने से ब्रेकिंग परिवर्तन नहीं होता है और यह कई रीफ के लिए जाने का रास्ता है। forwardRefमेरे दिमाग में आने के केवल फायदे हैं:

  • DOM नोड्स, फंक्शनल और क्लास कंपोनेंट्स के लिए यूनिफॉर्म एक्सेस API (आपने बताया कि)
  • ref यदि आप टाइपस्क्रिप्ट के साथ प्रकार प्रदान करते हैं, तो विशेषता आपके प्रॉम्प्स एपीआई को फूले नहीं समाती है

जब यह प्रतिपादन करने के लिए आता है और अतिरिक्त रेंडरर्स का कारण बनता है तो क्या कस्टम प्रोप को अलग करना प्रभावित करता है?

यदि आप इनलाइन कॉलबैक रेफरी फ़ंक्शन को प्रोप के रूप में पास करते हैं, तो एक रेफ संभावित रूप से फिर से रेंडर को ट्रिगर कर सकता है । लेकिन यह एक बेहतर विचार है कि इसे वर्ग उदाहरण विधि के रूप में परिभाषित किया जाए या जैसे कुछ संस्मरण के माध्यम से useCallback


1
बहुत बढ़िया धन्यवाद फोर्ड, मैंने सोचा कि ऐसा हो सकता है कि मामला कुछ प्रकाश चमकाने के लिए उत्सुक था।
लेसबा

0

RefReactघटकों में एक मानक संपत्ति है ।

कुछ घटक जो अतिरिक्त कार्यक्षमता प्रदान करने के लिए अन्य घटकों को लपेटते हैं, refलिपटे घटक को संदर्भित करने के लिए उपयोग करते हैं और उम्मीद करते हैं कि घटक के पास refसंपत्ति है।

एक घटक के लिए यह बेहतर है कि वह refसंपत्ति अन्य घटकों और पुस्तकालयों के साथ संगत हो।

फ़ंक्शन घटकों में "रेफरी" संपत्ति नहीं हो सकती है और संपत्ति forwardRefप्रदान करने के लिए इसका उपयोग करना चाहिए ref

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.