टी एल; डॉ
यदि आप एक रेफ टाइप करना चाहते हैं जो केवल देशी डोम तत्वों की अपेक्षा करता है, जैसे कि एक div
या एक input
, सही परिभाषा निम्नलिखित है:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.instanceOf(Element) })
])
मूल पोस्ट में वर्णित विशिष्ट मुद्दे का जवाब
ओपी प्रश्न के उदाहरण में, यह रेफ प्रोप प्रकार नहीं है जिसे घोषित करने की आवश्यकता है, लेकिन सामान रिफ द्वारा इंगित किया गया है, और जिसे रेडएक्स का उपयोग करके पास किया जाएगा mapStateToProps
। DOM तत्व के लिए प्रोप प्रकार होगा: myRefToBePutInReduxGlobalStore: PropTypes.instanceOf(Element)
(यदि यह DOM तत्व है)। हालांकि, मैं:
- इसका नाम बदलें
myElementToBePutInReduxGlobalStore
(एक तत्व रेफरी नहीं है)
- रिड्यूस स्टोर के अंदर गैर-धारावाहिक डेटा संग्रहीत करने से बचें
- प्रॉक्टर इंजीनियर एसईबी मार्कबेज द्वारा बताए गए प्रॉप्स में पासिंग एलिमेंट्स से बचें
वास्तविक प्रश्न का लंबा उत्तर
प्रश्न: रीएक्ट में रेफ के लिए सही प्रोपेप्ट क्या है?
उदाहरण उपयोग मामला:
function FancyInput({ inputRef }) {
return (
<div className="fancy">
Fancy input
<input ref={inputRef} />
</div>
)
}
FancyInput.propTypes = {
inputRef: ???
}
function App(props) {
const inputRef = React.useRef()
useLayoutEffect(function focusWhenStuffChange() {
inputRef.current?.focus()
}, [props.stuff])
return <FancyInput inputRef={inputRef} />
}
आज, प्रतिक्रिया में दो तरह के रेफ मौजूद हैं:
- एक वस्तु जो इस तरह दिखती है:
{ current: [something] }
आमतौर पर React.createRef()
सहायक या React.useRef()
हुक द्वारा बनाई गई
- एक कॉलबैक फ़ंक्शन जो
[something]
अपने तर्क के रूप में प्राप्त करेगा (जैसे कि ओपी उदाहरण में)
नोट: ऐतिहासिक रूप से, आप स्ट्रिंग रिफ़ का भी उपयोग कर सकते हैं, लेकिन इसे विरासत माना जाता है और प्रतिक्रिया से हटा दिया जाएगा
दूसरा आइटम काफी सरल है और निम्न प्रोप प्रकार की आवश्यकता है PropTypes.func
:।
पहला विकल्प कम स्पष्ट है क्योंकि आप रेफ द्वारा बताए गए तत्व के प्रकार को निर्दिष्ट करना चाह सकते हैं।
कई अच्छे जवाब
ref
DOM तत्व की तुलना में कुछ और इंगित कर सकते हैं।
यदि आप पूरी तरह से लचीला होना चाहते हैं:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.any })
])
उपर्युक्त सिर्फ वस्तु रेफ w / current
संपत्ति के आकार को लागू करता है । यह किसी भी तरह के रेफ के लिए हर समय काम करेगा। प्रोप प्रकार का उपयोग करने के उद्देश्य से, जो आपके विकसित होने पर किसी भी विसंगतियों को स्पॉट करने का एक तरीका है , यह संभवतः पर्याप्त है। यह बहुत कम संभावना है कि आकार के साथ एक वस्तु { current: [any] }
, और एक refToForward
प्रस्ताव को पारित किया जाता है , एक वास्तविक रेफरी नहीं होगा ।
हालाँकि , आप यह घोषित करना चाह सकते हैं कि आपके घटक को किसी भी प्रकार के रेफ की उम्मीद नहीं है , लेकिन केवल एक निश्चित प्रकार, जिसे देखते हुए इसे उस रेफरी की आवश्यकता है।
मैंने एक सैंडबॉक्स को सेटअप किया है जो रेफरी, यहां तक कि कुछ गैर पारंपरिक घोषित करने के लिए कुछ अलग तरीके दिखा रहा है, और फिर उन्हें अन्य प्रकार के साथ परीक्षण कर रहा है। आप इसे यहाँ पा सकते हैं ।
यदि आप केवल एक मूल इनपुट तत्व की ओर इशारा करते हुए रेफरी की अपेक्षा करते हैं, तो कोई HTML नहीं Element
:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.instanceOf(HTMLInputElement) })
])
यदि आप केवल रिएक्ट क्लास घटक की ओर इशारा करते हुए रेफरी की अपेक्षा करते हैं:
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.instanceOf(Component) })
])
यदि आप केवल useImperativeHandle
कुछ सार्वजनिक विधि को उजागर करने के लिए एक कार्यात्मक घटक की ओर इशारा करते हुए रेफरी की अपेक्षा करते हैं :
refProp: PropTypes.oneOfType([
PropTypes.func,
PropTypes.shape({ current: PropTypes.object })
])
नोट: उपरोक्त प्रोप प्रकार दिलचस्प है क्योंकि यह प्रतिक्रिया घटकों और मूल डोम तत्वों को भी कवर करता है, क्योंकि वे सभी आधार जावास्क्रिप्ट विरासत में प्राप्त कर रहे हैं Object
रेफरी के लिए प्रोप प्रकार घोषित करने का कोई एक अच्छा तरीका नहीं है, यह उपयोग पर निर्भर करता है। यदि आपका रेफरी किसी बहुत पहचानी गई चीज की ओर इशारा करता है, तो यह एक विशिष्ट प्रोप प्रकार जोड़ने के लायक हो सकता है। अन्यथा, केवल सामान्य आकार की जाँच करना पर्याप्त लगता है।
सर्वर साइड रेंडरिंग के बारे में ध्यान दें
यदि आपका कोड सर्वर पर चलना है, जब तक कि आप पहले से ही DOM वातावरण को पॉलीफ़िल नहीं करते हैं, Element
या कोई अन्य क्लाइंट-साइड प्रकार undefined
NJJS में नहीं होगा। आप इसका समर्थन करने के लिए निम्नलिखित शिम का उपयोग कर सकते हैं:
Element = typeof Element === 'undefined' ? function(){} : Element
निम्नलिखित रिएक्ट डॉक्स पृष्ठ रेफरी, ऑब्जेक्ट और कॉलबैक दोनों का उपयोग करने के तरीके के बारे में अधिक जानकारी देते हैं , और हुक का उपयोग कैसे करेंuseRef
उत्तर अपडेट किया गया @Rahul Sagore, @Ferenk Kamra, @svnm और @Kamuela Franco को धन्यवाद
ref
प्रोप को पास किया गया मान एक ऐसा फ़ंक्शन है जिसमें पहले तर्क के साथ DOM तत्व या नल का संदर्भ होता है। यह एक समारोह है ।