अद्यतन : प्रतिक्रिया 16.0 लिंक के माध्यम से पोर्टल पेश कियाReactDOM.createPortal
अद्यतन : प्रतिक्रिया के अगले संस्करणों (फाइबर: शायद 16 या 17) में पोर्टल बनाने की एक विधि शामिल होगी: ReactDOM.unstable_createPortal()
लिंक
पोर्टल का उपयोग करें
दान अब्रामोव का पहला भाग ठीक है, लेकिन इसमें बहुत सारे बॉयलरप्लेट शामिल हैं। जैसा कि उन्होंने कहा, आप पोर्टल्स का भी उपयोग कर सकते हैं। मैं उस विचार पर थोड़ा विस्तार करूँगा।
एक पोर्टल का लाभ यह है कि पॉपअप और बटन रिएक्ट ट्री में बहुत करीब रहते हैं, जिसमें बहुत ही सरल माता-पिता / बच्चे संचार का उपयोग करते हैं: आप आसानी से पोर्टल के साथ async क्रियाओं को संभाल सकते हैं, या माता-पिता को पोर्टल को अनुकूलित करने दे सकते हैं।
एक पोर्टल क्या है?
एक पोर्टल आपको सीधे document.body
एक तत्व के अंदर रेंडर करने की अनुमति देता है जो आपके रिएक्ट ट्री में गहरा घोंसला है।
विचार यह है कि उदाहरण के लिए आप शरीर में निम्नलिखित रिएक्ट ट्री प्रस्तुत करते हैं:
<div className="layout">
<div className="outside-portal">
<Portal>
<div className="inside-portal">
PortalContent
</div>
</Portal>
</div>
</div>
और आपको आउटपुट के रूप में मिलता है:
<body>
<div class="layout">
<div class="outside-portal">
</div>
</div>
<div class="inside-portal">
PortalContent
</div>
</body>
inside-portal
नोड के अंदर अनुवाद किया गया है <body>
अपनी सामान्य, गहरा-नेस्टेड जगह के बजाय,।
जब एक पोर्टल का उपयोग करने के लिए
एक पोर्टल उन तत्वों को प्रदर्शित करने के लिए विशेष रूप से उपयोगी है जो आपके मौजूदा रिएक्ट घटकों के शीर्ष पर जाने चाहिए: पॉपअप, ड्रॉपडाउन, सुझाव, हॉटस्पॉट्स
एक पोर्टल का उपयोग क्यों करें
कोई z- इंडेक्स समस्याएं अब नहीं हैं : एक पोर्टल आपको रेंडर करने की अनुमति देता है <body>
। यदि आप एक पॉपअप या ड्रॉपडाउन प्रदर्शित करना चाहते हैं, तो यह एक बहुत अच्छा विचार है यदि आप z- इंडेक्स समस्याओं के खिलाफ लड़ाई नहीं करना चाहते हैं। पोर्टल तत्व document.body
माउंट ऑर्डर में जोड़े जाते हैं , जिसका अर्थ है कि जब तक आप साथ नहीं खेलते हैं z-index
, डिफ़ॉल्ट व्यवहार बढ़ते क्रम में, एक दूसरे के ऊपर पोर्टल्स को स्टैक करने के लिए होगा। व्यवहार में, इसका मतलब है कि आप एक पॉपअप को दूसरे पॉपअप के अंदर से सुरक्षित रूप से खोल सकते हैं, और सुनिश्चित करें कि 2 पॉपअप पहले के शीर्ष पर प्रदर्शित किया जाएगा, इसके बारे में भी सोचने के बिना z-index
।
प्रयोग में
सबसे सरल: स्थानीय प्रतिक्रिया स्थिति का उपयोग करें: यदि आपको लगता है, एक साधारण हटाने की पुष्टि पॉपअप के लिए, यह Redux बॉयलरप्लेट के लायक नहीं है, तो आप एक पोर्टल का उपयोग कर सकते हैं और यह आपके कोड को बहुत सरल करता है। ऐसे उपयोग के मामले के लिए, जहां इंटरैक्शन बहुत स्थानीय है और वास्तव में काफी कार्यान्वयन विस्तार है, क्या आप वास्तव में हॉट-रीलोडिंग, टाइम-ट्रैवलिंग, एक्शन लॉगिंग और सभी लाभों के बारे में परवाह करते हैं जो Redux आपको लाता है? व्यक्तिगत रूप से, मैं इस मामले में स्थानीय स्थिति का उपयोग नहीं करता हूं। कोड उतना ही सरल हो जाता है:
class DeleteButton extends React.Component {
static propTypes = {
onDelete: PropTypes.func.isRequired,
};
state = { confirmationPopup: false };
open = () => {
this.setState({ confirmationPopup: true });
};
close = () => {
this.setState({ confirmationPopup: false });
};
render() {
return (
<div className="delete-button">
<div onClick={() => this.open()}>Delete</div>
{this.state.confirmationPopup && (
<Portal>
<DeleteConfirmationPopup
onCancel={() => this.close()}
onConfirm={() => {
this.close();
this.props.onDelete();
}}
/>
</Portal>
)}
</div>
);
}
}
सरल: आप अभी भी Redux राज्य का उपयोग कर सकते हैं : यदि आप वास्तव में चाहते हैं, तो आप अभी भी connect
यह चुनने के लिए उपयोग कर सकते हैं कि DeleteConfirmationPopup
दिखाया गया है या नहीं। चूंकि पोर्टल आपके रिएक्ट ट्री में गहराई से रहता है, इसलिए इस पोर्टल के व्यवहार को अनुकूलित करना बहुत सरल है क्योंकि आपके माता-पिता पोर्टल पर प्रॉपर से गुजर सकते हैं। यदि आप पोर्टल्स का उपयोग नहीं करते हैं, तो आपको आमतौर पर अपने रिएक्ट ट्री के शीर्ष पर अपने पॉपअप को प्रस्तुत करना होगाz-index
कारण हैं , और आमतौर पर चीजों के बारे में सोचना होगा "मैं जेनेरिक DeleteConfirmationPopup को कैसे अनुकूलित करता हूं, मैं उपयोग के मामले के अनुसार बनाया गया हूं "। और आमतौर पर आप इस समस्या का काफी आसान समाधान पाएंगे, जैसे कि एक क्रिया को भेजना, जिसमें नेस्टेड पुष्टिकरण / रद्द करने की क्रियाएं, एक ट्रांसलेशन बंडल कुंजी, या इससे भी बदतर, एक रेंडर फ़ंक्शन (या कुछ और अनजाने में) शामिल है। आपको पोर्टल्स के साथ ऐसा करने की ज़रूरत नहीं है, और बस नियमित रूप से प्रॉपर पास कर सकते हैं, क्योंकि DeleteConfirmationPopup
अभी बच्चा हैDeleteButton
निष्कर्ष
पोर्टल आपके कोड को सरल बनाने के लिए बहुत उपयोगी हैं। मैं अब उनके बिना नहीं कर सकता।
ध्यान दें कि पोर्टल कार्यान्वयन आपको अन्य उपयोगी सुविधाओं के साथ भी मदद कर सकता है:
- सरल उपयोग
- पोर्टल को बंद करने के लिए एस्पास शॉर्टकट
- क्लिक के बाहर हैंडल (करीबी पोर्टल या नहीं)
- लिंक लिंक पर क्लिक करें (करीब पोर्टल या नहीं)
- प्रतिक्रिया संदर्भ पोर्टल पेड़ में उपलब्ध कराया गया
पॉप - अप, मोडल और ओवरले के लिए प्रतिक्रिया-पोर्टल या रिएक्शन-मोडल अच्छे हैं, जो फुल-स्क्रीन होने चाहिए, जो आमतौर पर स्क्रीन के बीच में केंद्रित होते हैं।
रिएक्ट-टीथर अधिकांश रिएक्ट डेवलपर्स के लिए अज्ञात है, फिर भी यह सबसे उपयोगी उपकरणों में से एक है जिसे आप वहां पता कर सकते हैं। टीथर आपको पोर्टल बनाने की अनुमति देता है, लेकिन स्वचालित रूप से पोर्टल को स्थिति देगा, किसी दिए गए लक्ष्य के सापेक्ष। यह टूलटिप्स, ड्रॉपडाउन, हॉटस्पॉट, हेल्पबॉक्स के लिए एकदम सही है ... यदि आपको कभी भी पोजिशन और absolute
/ या आपके व्यूपोर्ट के बाहर जाने की समस्या है, तो टीथर आपके लिए वह सब हल कर देगा।relative
z-index
उदाहरण के लिए, आप आसानी से ऑनबोर्डिंग हॉटस्पॉट को लागू कर सकते हैं, जो एक बार क्लिक किए जाने पर टूलटिप तक फैल जाता है:
असली उत्पादन कोड यहाँ। कोई सरल नहीं हो सकता है :)
<MenuHotspots.contacts>
<ContactButton/>
</MenuHotspots.contacts>
संपादित करें : बस खोज की गई प्रतिक्रिया-प्रवेश द्वार जो पोर्टल्स को आपकी पसंद के नोड में प्रस्तुत करने की अनुमति देता है (जरूरी नहीं कि शरीर)
संपादित करें : ऐसा लगता है कि प्रतिक्रिया-पॉपर प्रतिक्रिया-टीथर का एक सभ्य विकल्प हो सकता है। पॉपपरजेएस एक पुस्तकालय है जो केवल एक तत्व के लिए एक उपयुक्त स्थिति की गणना करता है, बिना डीओएम को सीधे स्पर्श किए बिना, उपयोगकर्ता को यह चुनने देता है कि वह डोम नोड को कहां और कब डालना चाहता है, जबकि टेडर सीधे शरीर में जोड़ता है।
संपादित करें : इसमें प्रतिक्रिया-स्लॉट-भरण भी है जो दिलचस्प है और एक तत्व को आरक्षित तत्व स्लॉट को प्रस्तुत करने की अनुमति देकर समान समस्याओं को हल करने में मदद कर सकता है जिसे आप अपने पेड़ में कहीं भी रखना चाहते हैं।