React.js पोर्टल

अपने स्वयं के डोम-पेड़ के बाहर तत्वों को प्रस्तुत करने का जादू

React.js . में टेलीपोर्टेशन

क्या आप जानते हैं कि रिएक्ट "पोर्टल" नामक एक विशेष और बहुत शक्तिशाली घटक प्रदान करता है जो अपने बच्चों को आपके ऐप के अंदर पूरी तरह से अलग जगह पर माउंट कर सकता है? यदि नहीं, तो कुछ नया सीखने का समय आ गया है!

एक React.js पोर्टल की शारीरिक रचना

यहां एक त्वरित अवलोकन दिया गया है कि कैसे React.js में पोर्टल-घटक पहले काम करता है।

  • कहीं आपके कोड में, आप एक ऐसा तत्व माउंट करते हैं जो पोर्टल के बच्चों को होस्ट करेगा
  • तब आपको इस तत्व का संदर्भ मिलता है
  • अपने ऐप में कहीं और, आप पोर्टल-घटक को माउंट करते हैं और होस्ट-एलिमेंट से प्राप्त संदर्भ को पास करते हैं
  • सब कुछ जो अब पोर्टल के अंदर माउंट किया गया है वास्तव में पहले चरण से होस्ट में माउंट किया जाएगा

क्या हो रहा है इसे बेहतर ढंग से समझने के लिए, मैंने पोर्टल-कार्यक्षमता को स्पष्ट करने के लिए निम्नलिखित सरल विज़ुअलाइज़ेशन बनाए हैं।

Image ee9c2dac28e7

Image 70ff8978589d

Image 886ed0a34985

इन छवियों पर निर्माण, निम्नलिखित ग्राफिक्स समान प्रक्रिया दिखाते हैं, लेकिन इस बार सरलीकृत कोड उदाहरणों के साथ।

Image dd655b015a22

Image ab94e9940e3a

पोर्टल जितना आप शुरू में सोच सकते हैं उससे कहीं अधिक शक्तिशाली है। यहां तक कि यह कई पोर्टलों से कई बच्चों को एक ही लक्ष्य तत्व में प्रस्तुत करने की अनुमति देता है। पोर्टलों के माउंटिंग का क्रम भी मेजबान में तत्वों के क्रम को परिभाषित करता है।

Image de39ae9a02a2

Image b12fdf680f24

होस्ट-एलिमेंट के संदर्भ को साझा करना जिसमें सभी टेलीपोर्ट किए गए बच्चे शामिल होंगे, भी बहुत आसान है। आधिकारिक दस्तावेज document.getElementById के उपयोग का वर्णन करता है, लेकिन आप React.js के useRef-hook का भी उपयोग कर सकते हैं। निम्नलिखित कोड उदाहरण एक सरल कार्यान्वयन को दर्शाता है जो अब तक वर्णित सब कुछ दिखाता है।

import React, { useEffect, useRef, useState } from "react";
import ReactDOM, { createPortal } from "react-dom";

//
// Link to sandbox:
// 👉 https://codesandbox.io/s/react-16-8-0-forked-d8lm1?file=/src/index.js:0-1067
//

// A simple demonstration of the React-Portal
// w/ multiple portals for the same target.
function App() {
  const ref = useRef(null);
  const [isRefReady, setIsRefReady] = useState(false);

  // Run one more render to actually
  // show the content of our portal.
  // This is necessary, as the setter
  // for the 'ref' alone won't trigger
  // a render.
  useEffect(() => {
    setIsRefReady(Boolean(ref));
  }, []);

  return (
    <div>
      <div>
        {/* The 'target' aka host for our portals. */}
        <header ref={ref} style={{display: "flex", gap: 8 }} />
        <hr/>
      </div>
      <h1>
        Debug
      </h1>
      {isRefReady && createPortal(<button>one</button>, ref.current)}
      {isRefReady && createPortal(<button>two</button>, ref.current)}
      <div>
        {isRefReady && createPortal(<button>three</button>, ref.current)}
      </div>
    </div>
  );
}

ReactDOM.render(<App />, document.querySelector("#root"));

पोर्टल-घटक कैसे सरल कोडिंग को सक्षम बनाता है

संभवतः React.js पोर्टल के लिए सबसे आम उपयोग का मामला एक मॉडल घटक का कार्यान्वयन है। आप बस अपने ऐप के पेड़ की जड़ में लक्ष्य को परिभाषित कर सकते हैं और पोर्टल-घटक का उपयोग हर जगह से एक मोडल माउंट करने के लिए कर सकते हैं, सभी सामग्री के ऊपर मज़बूती से तैरते हुए।

एक अन्य उपयोग का मामला जिसे मैंने वास्तव में लागू किया है वह एक टैब कंटेनर का उपयोग है। एक टैब कंटेनर के रूप में टैब आइटम के साथ-साथ टैब चयनित होने पर प्रस्तुत करने के लिए सामग्री दोनों की आवश्यकता होती है, मैं बस दो मेजबानों को परिभाषित करता हूं, एक टैब-पंक्ति के लिए और दूसरा चयनित सामग्री के लिए।

फिर मैं केवल घटकों की एक सरणी माउंट करता हूं जो प्रत्येक टैब-आइटम के साथ-साथ चयनित सामग्री के लिए एक पोर्टल का उपयोग करते हैं। यह मुझे व्यापार तर्क रखने की अनुमति देता है जहां यह वास्तव में संबंधित है - प्रत्येक अलग घटक में।

Image 2761da74cf8c

Image e7810bb469d2

पोर्टल-घटक के लिए निश्चित रूप से और भी दिलचस्प उपयोग के मामले हैं। सबसे बड़ा लाभ जो मुझे लगता है कि यह सक्षम बनाता है वह एक घटक में व्यावसायिक तर्क का तंग युग्मन है, जिसके बच्चे अलग-अलग जगहों पर चढ़ जाते हैं। यह पैटर्न महान लचीलेपन और अनुकूलन की अनुमति देता है, लेकिन आपके कोडबेस में भ्रम पैदा कर सकता है कि विचार वास्तव में कैसे संबंधित हैं।

कृपया React.js पोर्टल के संबंध में सभी विवरणों के लिए आधिकारिक दस्तावेज़ीकरण पर एक नज़र डालें।

सुझाव

संबंधित

परिशिष्ट

भाषाएँ