घटकों को संवाद करने के कई तरीके हैं। कुछ आपके usecase के अनुकूल हो सकते हैं। यहाँ कुछ लोगों की सूची दी गई है जिन्हें मैंने जाना है।
प्रतिक्रिया
माता-पिता / बाल प्रत्यक्ष संचार
const Child = ({fromChildToParentCallback}) => (
<div onClick={() => fromChildToParentCallback(42)}>
Click me
</div>
);
class Parent extends React.Component {
receiveChildValue = (value) => {
console.log("Parent received value from child: " + value); // value is 42
};
render() {
return (
<Child fromChildToParentCallback={this.receiveChildValue}/>
)
}
}
यहां बाल घटक माता-पिता द्वारा प्रदान किए गए कॉलबैक को एक मूल्य के साथ कॉल करेगा, और माता-पिता माता-पिता में बच्चों द्वारा प्रदान किए गए मूल्य को प्राप्त करने में सक्षम होंगे।
यदि आप अपने ऐप के एक फीचर / पेज का निर्माण करते हैं, तो कॉलबैक / स्टेट (जिसे भी कहा जाता है ) container
या smart component
सभी चाइल्ड को स्टेटलेस होने के लिए सिंगल पेरेंट का प्रबंध करना बेहतर होता है , केवल पेरेंट्स को चीजों की रिपोर्टिंग करना। इस तरह आप आसानी से किसी भी बच्चे को माता-पिता की स्थिति को "साझा" कर सकते हैं, जिसे इसकी आवश्यकता है।
प्रसंग
प्रतिक्रिया संदर्भ आपके घटक पदानुक्रम की जड़ में राज्य को रखने की अनुमति देता है, और हर मध्यवर्ती घटकों को सहारा पास करने के लिए परेशानी के बिना इस राज्य को आसानी से बहुत गहरे नेस्टेड घटकों में इंजेक्ट करने में सक्षम है।
अब तक, संदर्भ एक प्रायोगिक विशेषता थी, लेकिन एक नया एपीआई प्रतिक्रिया 16.3 में उपलब्ध है।
const AppContext = React.createContext(null)
class App extends React.Component {
render() {
return (
<AppContext.Provider value={{language: "en",userId: 42}}>
<div>
...
<SomeDeeplyNestedComponent/>
...
</div>
</AppContext.Provider>
)
}
};
const SomeDeeplyNestedComponent = () => (
<AppContext.Consumer>
{({language}) => <div>App language is currently {language}</div>}
</AppContext.Consumer>
);
उपभोक्ता का उपयोग कर रहा है रेंडर प्रोप / चिल्ड्रेन फंक्शन पैटर्न
अधिक जानकारी के लिए इस ब्लॉग पोस्ट की जाँच करें ।
16.3 प्रतिक्रिया से पहले, मैं प्रतिक्रिया-प्रसारण का उपयोग करने की सलाह दूंगा जो काफी समान एपीआई की पेशकश करता है, और पूर्व संदर्भ एपीआई का उपयोग करता है।
पोर्टल
एक पोर्टल का उपयोग तब करें जब आप सामान्य माता-पिता / बच्चे की तरह साधारण कार्यों के साथ संवाद करने के लिए 2 घटकों को एक साथ रखना चाहते हैं, लेकिन आप नहीं चाहते हैं कि इन 2 घटकों को DOM में माता-पिता / बच्चे का रिश्ता हो, क्योंकि दृश्य / सीएसएस की कमी का तात्पर्य है (जैसे z- इंडेक्स, अपारदर्शिता ...)।
इस मामले में आप "पोर्टल" का उपयोग कर सकते हैं। पोर्टल्स का उपयोग करके अलग-अलग प्रतिक्रिया पुस्तकालय हैं , आमतौर पर मॉडल , पॉपअप, टूलटिप्स के लिए उपयोग किया जाता है ...
निम्नलिखित को धयान मे रखते हुए:
<div className="a">
a content
<Portal target="body">
<div className="b">
b content
</div>
</Portal>
</div>
अंदर प्रस्तुत किए जाने पर निम्नलिखित DOM उत्पन्न कर सकता है reactAppContainer
:
<body>
<div id="reactAppContainer">
<div className="a">
a content
</div>
</div>
<div className="b">
b content
</div>
</body>
अधिक जानकारी यहाँ
स्लॉट्स
आप कहीं एक स्लॉट को परिभाषित करते हैं, और फिर आप अपने रेंडर ट्री के किसी अन्य स्थान से स्लॉट को भरते हैं।
import { Slot, Fill } from 'react-slot-fill';
const Toolbar = (props) =>
<div>
<Slot name="ToolbarContent" />
</div>
export default Toolbar;
export const FillToolbar = ({children}) =>
<Fill name="ToolbarContent">
{children}
</Fill>
यह कुछ हद तक पोर्टल्स के समान है सिवाय भरे हुए कंटेंट को आपके द्वारा परिभाषित एक स्लॉट में प्रस्तुत किया जाएगा, जबकि पोर्टल्स आम तौर पर एक नया डोम नोड (अक्सर डॉक्यूमेंट के एक बच्चे) प्रस्तुत करते हैं।
प्रतिक्रिया-स्लॉट-भरण पुस्तकालय की जाँच करें
घटना बस
जैसा कि प्रतिक्रिया दस्तावेज में कहा गया है :
दो घटकों के बीच संचार के लिए, जिनके माता-पिता-बच्चे के संबंध नहीं हैं, आप अपना स्वयं का वैश्विक ईवेंट सिस्टम सेट कर सकते हैं। जब आप कोई ईवेंट प्राप्त करते हैं, तो कंपोनेंटमाउंट (), और घटकविलीयूएनमाउंट (), और कॉल सेटस्टेट () में सदस्यता समाप्त करें।
एक इवेंट बस को सेटअप करने के लिए आप कई चीजों का उपयोग कर सकते हैं। आप केवल श्रोताओं की एक सरणी बना सकते हैं, और ईवेंट प्रकाशित होने पर, सभी श्रोता ईवेंट प्राप्त करेंगे। या आप EventEmitter या PostalJs जैसी किसी चीज़ का उपयोग कर सकते हैं
फ्लक्स
फ्लक्स मूल रूप से एक इवेंट बस है, सिवाय इवेंट रिसीवर्स स्टोर के। यह मूल घटना बस प्रणाली के समान है सिवाय राज्य को प्रतिक्रिया के बाहर प्रबंधित किया जाता है
ओरिजिनल फ्लक्स का कार्यान्वयन इवेंट-सोर्सिंग को हैक करने के तरीके की तरह करता है।
Redux मेरे लिए फ्लक्स कार्यान्वयन है जो इवेंट-सोर्सिंग से सबसे नज़दीक है, कई फ़ायदे हैं जो इवेंट-सोर्सिंग के कई फायदे हैं जैसे समय-यात्रा करने की क्षमता। यह सख्ती से रिएक्ट से जुड़ा नहीं है और इसका उपयोग अन्य कार्यात्मक दृश्य पुस्तकालयों के साथ भी किया जा सकता है।
Egghead का Redux वीडियो ट्यूटोरियल वास्तव में अच्छा है और बताता है कि यह आंतरिक रूप से कैसे काम करता है (यह वास्तव में सरल है)।
कर्सर
Cloors ClojureScript / Om से आ रहे हैं और व्यापक रूप से React प्रोजेक्ट्स में उपयोग किए जाते हैं। वे प्रतिक्रिया के बाहर राज्य का प्रबंधन करने की अनुमति देते हैं, और घटक पेड़ के बारे में कुछ भी जानने की आवश्यकता के बिना कई घटकों को राज्य के एक ही हिस्से में पढ़ने / लिखने की अनुमति देते हैं।
कई कार्यान्वयन मौजूद हैं, जिनमें ImmutableJS , प्रतिक्रिया-कर्सर और सर्वज्ञ शामिल हैं
संपादन २०१६ : ऐसा लगता है कि लोग सहमत हैं कि शाप देने वाले छोटे ऐप्स के लिए ठीक काम करते हैं, लेकिन यह जटिल ऐप्स पर अच्छा नहीं लगता। ओम नेक्सस के पास अब कोई शाप नहीं है (जबकि यह ओम है जिसने शुरू में अवधारणा पेश की थी)
एल्म वास्तुकला
एल्म वास्तुकला द्वारा इस्तेमाल किया जा करने का प्रस्ताव एक वास्तुकला है एल्म भाषा । भले ही एल्म रिएक्टजेएस नहीं है, फिर भी रिएक्ट में एल्म आर्किटेक्चर किया जा सकता है।
Redux के लेखक डैन अब्रामोव ने रिएक्ट का उपयोग करके एल्म वास्तुकला का कार्यान्वयन किया ।
Redux और Elm दोनों ही वास्तव में बहुत अच्छे हैं और फ्रंटएंड पर इवेंट-सोर्सिंग कॉन्सेप्ट को सशक्त बनाने के लिए हैं, दोनों समय-यात्रा डिबगिंग, पूर्ववत / रीडो, रीप्ले की अनुमति देते हैं ...
Redux और Elm के बीच मुख्य अंतर यह है कि एल्म राज्य प्रबंधन के बारे में बहुत अधिक सख्त हैं। एल्म में आपके पास स्थानीय घटक स्थिति या माउंट / अनमाउंट हुक नहीं हो सकते हैं और सभी डोम परिवर्तन को वैश्विक राज्य परिवर्तनों द्वारा ट्रिगर किया जाना चाहिए। एल्म आर्किटेक्चर एक स्केलेबल दृष्टिकोण का प्रस्ताव करता है जो एक अपरिवर्तनीय वस्तु के अंदर सभी राज्य को संभालने की अनुमति देता है , जबकि Redux एक दृष्टिकोण का प्रस्ताव करता है जो आपको एक अपरिवर्तनीय वस्तु में राज्य के MOST को संभालने के लिए आमंत्रित करता है ।
जबकि एल्म का वैचारिक मॉडल बहुत ही सुंदर है और वास्तुकला बड़े ऐप्स पर अच्छी तरह से स्केल करने की अनुमति देती है, यह मुश्किल हो सकता है या सरल कार्यों को प्राप्त करने के लिए अधिक बॉयलरप्लेट को शामिल कर सकता है जैसे कि बढ़ते के बाद किसी इनपुट पर ध्यान देना, या किसी मौजूदा लाइब्रेरी के साथ एकीकरण करना। एक अनिवार्य इंटरफ़ेस (यानी JQuery प्लगइन) के साथ। संबंधित मुद्दा ।
इसके अलावा, एल्म वास्तुकला में अधिक कोड बॉयलरप्लेट शामिल है। यह लिखने के लिए क्रिया या जटिल नहीं है, लेकिन मुझे लगता है कि एल्म वास्तुकला सांख्यिकीय रूप से टाइप की जाने वाली भाषाओं के लिए अधिक अनुकूल है।
एफआरपी
RxJS, BaconJS या केफिर जैसे पुस्तकालयों का उपयोग घटकों के बीच संचार को संभालने के लिए FRP स्ट्रीम बनाने के लिए किया जा सकता है।
आप Rx-React उदाहरण के लिए प्रयास कर सकते हैं
मुझे लगता है कि ईएलएम भाषा संकेतों के साथ जो प्रदान करती है उसका उपयोग करने के लिए इन कामों का उपयोग काफी समान है ।
CycleJS फ्रेमवर्क ReactJS का उपयोग नहीं करता है, लेकिन vdom का उपयोग करता है । यह एल्म वास्तुकला के साथ बहुत सारी समानताएं साझा करता है (लेकिन वास्तविक जीवन में इसका उपयोग करना अधिक आसान है क्योंकि यह वुड हुक की अनुमति देता है) और यह फ़ंक्शन के बजाय बड़े पैमाने पर आरएक्सजे का उपयोग करता है, और यदि आप एफआरपी का उपयोग करना चाहते हैं तो प्रेरणा का एक अच्छा स्रोत हो सकता है। प्रतिक्रिया होती है। CycleJs Egghead वीडियो यह समझने में अच्छा है कि यह कैसे काम करता है।
सीएसपी
CSP (कम्यूनिकेटिंग सेक्शनल प्रोसेस) वर्तमान में लोकप्रिय हैं (ज्यादातर गो / गोरआउट और core.async / ClojureScript के कारण) लेकिन आप इन्हें JS-CSP के साथ जावास्क्रिप्ट में भी उपयोग कर सकते हैं ।
जेम्स लॉन्ग ने एक वीडियो किया है जिसमें बताया गया है कि इसे कैसे रिएक्ट के साथ इस्तेमाल किया जा सकता है।
गाथा
एक गाथा एक बैकएंड अवधारणा है जो DDD / EventSourcing / CQRS दुनिया से आती है, जिसे "प्रक्रिया प्रबंधक" भी कहा जाता है। इसे रेडक्स-सागा द्वारा लोकप्रिय बनाया जा रहा है प्रोजेक्ट , ज्यादातर साइड-इफेक्ट्स (यानी एपीआई कॉल आदि) से निपटने के लिए Redux-thunk के प्रतिस्थापन के रूप में। ज्यादातर लोग वर्तमान में इसे केवल साइड-इफेक्ट्स के लिए सेवाएं मानते हैं, लेकिन यह वास्तव में डिकम्पलिंग घटकों के बारे में अधिक है।
यह एक पूरी तरह से नई संचार प्रणाली की तुलना में एक फ्लक्स आर्किटेक्चर (या रेडक्स) के लिए एक तारीफ है, क्योंकि गाथा अंत में फ्लक्स कार्यों का उत्सर्जन करती है। विचार यह है कि यदि आपके पास विजेट 1 और विजेट 2 हैं, और आप चाहते हैं कि उन्हें डिकॉय किया जाए, तो आप विजेट 1 पर विजेट 2 को लक्षित कर आग नहीं लगा सकते। इसलिए आप विजेट 1 को केवल फायर एक्शन बनाते हैं जो खुद को निशाना बनाते हैं, और गाथा एक "पृष्ठभूमि प्रक्रिया" है जो विजेट 1 क्रियाओं के लिए सुनता है, और विजेट 2 को लक्षित करने वाली क्रियाएं भेज सकता है। गाथा 2 विगेट्स के बीच युग्मन बिंदु है, लेकिन विजेट्स डिकूप्ड रहते हैं।
यदि आप रुचि रखते हैं तो मेरे उत्तर पर एक नज़र डालें
निष्कर्ष
यदि आप इन विभिन्न शैलियों का उपयोग करके उसी छोटे ऐप का एक उदाहरण देखना चाहते हैं, तो इस भंडार की शाखाओं की जांच करें ।
मुझे नहीं पता कि दीर्घकालिक में सबसे अच्छा विकल्प क्या है, लेकिन मुझे वास्तव में पसंद है कि फ्लक्स इवेंट-सोर्सिंग की तरह कैसे दिखता है।
यदि आप ईवेंट-सोर्सिंग कॉन्सेप्ट्स नहीं जानते हैं, तो इस बहुत ही अलग ब्लॉग पर एक नज़र डालें: अपाचे सामज़ा के साथ डेटाबेस को बाहर करना , यह समझना चाहिए कि फ्लक्स अच्छा क्यों है (लेकिन यह एफआरपी पर भी लागू हो सकता है) )
मुझे लगता है कि समुदाय इस बात से सहमत है कि सबसे अधिक होनहार फ्लक्स कार्यान्वयन रेडक्स है , जो उत्तरोत्तर गर्म लोडिंग के लिए बहुत उत्पादक डेवलपर अनुभव की अनुमति देगा। प्रभावशाली लाइवकोडिंग अला ब्रीट विक्टर का सिद्धांत वीडियो पर आविष्कार संभव है!