यह चर्चा कुछ समय के लिए रही है और @Alexander T. के जवाब ने मेरे जैसे नए रिएक्ट का अनुसरण करने के लिए एक अच्छा मार्गदर्शक प्रदान किया। और मैं घटक को ताज़ा करने के लिए एक ही एपीआई को कई बार कॉल करने के बारे में कुछ अतिरिक्त जानकारी साझा करने वाला हूं, मुझे लगता है कि यह शायद एक आम समस्या है जो नौसिखिया शुरुआत में सामना कर सकती है।
componentWillReceiveProps(nextProps)
, से आधिकारिक दस्तावेज :
यदि आपको प्रोपर परिवर्तनों (उदाहरण के लिए, इसे रीसेट करने के लिए) की प्रतिक्रिया में राज्य को अपडेट करने की आवश्यकता है, तो आप इस तरीके की तुलना कर सकते हैं। क्रॉप्स और नेक्स्टप्रॉप्स और स्टेट ट्रांज़ैक्शन का उपयोग करते हुए इस पद्धति का उपयोग करें।
हम यह निष्कर्ष निकाल सकते हैं कि यहां वह स्थान है जिसे हम मूल घटक से प्रॉपर संभालते हैं, एपीआई कॉल और अद्यतन स्थिति है।
@Alexander T के उदाहरण पर आधार:
export default class UserList extends React.Component {
constructor(props) {
super(props);
this.state = {person: []};
}
componentDidMount() {
//For our first load.
this.UserList(this.props.group); //maybe something like "groupOne"
}
componentWillReceiveProps(nextProps) {
// Assuming parameter comes from url.
// let group = window.location.toString().split("/")[*indexParameterLocated*];
// this.UserList(group);
// Assuming parameter comes from props that from parent component.
let group = nextProps.group; // Maybe something like "groupTwo"
this.UserList(group);
}
UserList(group) {
$.getJSON('https://randomuser.me/api/' + group)
.then(({ results }) => this.setState({ person: results }));
}
render() {
return (...)
}
}
अपडेट करें
componentWillReceiveProps()
पदावनत किया जाएगा।
यहाँ जीवन चक्र में केवल कुछ विधियाँ (उन सभी में डॉक्टर ) हैं जो मुझे लगता है कि सामान्य स्थिति में एपीआई की तैनाती से संबंधित होगी:
ऊपर आरेख का संदर्भ देकर:
एपीआई में तैनात करें componentDidMount()
यहाँ एपीआई कॉल करने का उचित परिदृश्य यह है कि इस घटक की सामग्री (एपीआई की प्रतिक्रिया से) स्थिर होगी, componentDidMount()
केवल एक बार आग लगने पर घटक बढ़ रहा है, यहां तक कि नए प्रॉप्स को मूल घटक से पारित किया जाता है या नेतृत्व करने के लिए क्रियाएं होती हैं re-rendering
।
घटक पुन: रेंडर करने के लिए अंतर की जांच करता है लेकिन पुन: माउंट नहीं करता है । डॉक्टर
से उद्धरण :
यदि आपको दूरस्थ समापन बिंदु से डेटा लोड करने की आवश्यकता है, तो नेटवर्क अनुरोध को तुरंत करने के लिए यह एक अच्छी जगह है।
- एपीआई में तैनात करें
static getDerivedStateFromProps(nextProps, prevState)
हमें ध्यान देना चाहिए कि दो प्रकार के घटक अद्यतन होते हैं , setState()
वर्तमान घटक में इस विधि को ट्रिगर करने के लिए नेतृत्व नहीं किया जाएगा , लेकिन मूल घटक से पुन: प्रतिपादन या नए सहारा । हमें पता चला कि बढ़ते समय यह विधि भी आग लगाती है।
यह एपीआई को तैनात करने के लिए एक उचित स्थान है यदि हम एक टेम्पलेट की तरह वर्तमान घटक का उपयोग करना चाहते हैं, और एपीआई के लिए नए पैरामीटर मूल घटक से आने वाले प्रॉप्स हैं ।
हमें एपीआई से एक अलग प्रतिक्रिया मिलती है और state
इस घटक की सामग्री को बदलने के लिए यहां एक नया रिटर्न मिलता है ।
उदाहरण के लिए:
हमारे पास मूल घटक में विभिन्न कारों के लिए एक ड्रॉपडाउन सूची है, इस घटक को चयनित के विवरण को दिखाने की आवश्यकता है।
- एपीआई में तैनात करें
componentDidUpdate(prevProps, prevState)
से अलग static getDerivedStateFromProps()
, इस विधि प्रारंभिक प्रतिपादन को छोड़कर हर प्रतिपादन के तुरंत बाद शुरू हो जाती है। हमारे पास एक घटक में एपीआई कॉलिंग और रेंडर अंतर हो सकता है।
पिछले उदाहरण का विस्तार करें:
कार के विवरण दिखाने के लिए घटक में इस कार की श्रृंखला की एक सूची शामिल हो सकती है, यदि हम 2013 के उत्पादन की जांच करना चाहते हैं, तो हम setState()
इस पर विचार करने के लिए पहली बार नेतृत्व करने के लिए क्लिक या चुन सकते हैं ... सूची आइटम व्यवहार (जैसे सूची आइटम को हाइलाइट करना) इस घटक में, और निम्नलिखित में componentDidUpdate()
हम नए पैरामीटर (राज्य) के साथ अपना अनुरोध भेजते हैं। प्रतिक्रिया मिलने के बाद, हम setState()
फिर से कार विवरण के विभिन्न कंटेंट को प्रस्तुत करने के लिए। componentDidUpdate()
इन्फिनिटी लूप को उत्पन्न करने से निम्नलिखित को रोकने के लिए , हमें prevState
यह तय करने के लिए इस विधि की शुरुआत में उपयोग करके राज्य की तुलना करने की आवश्यकता है कि क्या हम एपीआई भेजते हैं और नई सामग्री को प्रस्तुत करते हैं।
यह विधि वास्तव में static getDerivedStateFromProps()
प्रॉप्स की तरह ही उपयोग की जा सकती है , लेकिन props
उपयोग द्वारा परिवर्तनों को संभालने की आवश्यकता है prevProps
। और हमें componentDidMount()
प्रारंभिक एपीआई कॉल को संभालने के लिए सहयोग करने की आवश्यकता है ।
डॉक्टर से उद्धरण :
... यह नेटवर्क अनुरोधों को करने के लिए भी एक अच्छा स्थान है जब तक कि आप वर्तमान प्रॉप्स की तुलना पिछले प्रॉप्स से करते हैं ...
componentDidMount
कॉलबैक में आपकी स्थिति में एपीआई कार्यों को कॉल कर सकते हैं ।