यहाँ तीन उत्तर दिए गए हैं, प्रतिक्रिया के संस्करण पर निर्भर करता है कि आप किसके साथ काम करने के लिए मजबूर हैं (और क्या आप हुक का उपयोग करना चाहते हैं)।
पहली चीजें पहले:
यह समझना महत्वपूर्ण है कि रिएक्ट कैसे काम करता है, इसलिए आप चीजों को ठीक से कर सकते हैं (प्रोटिप: यह सुपर है रिएक्ट वेबसाइट पर रिएक्ट ट्यूटोरियल व्यायाम के माध्यम से चलने मूल्य है। यह अच्छी तरह से लिखा गया है, और सभी मूल बातें इस तरह से कवर करता है जो वास्तव में समझाता है कि कैसे करना है। चीजें)। यहां "उचित रूप से" का अर्थ है कि आप एक एप्लिकेशन इंटरफ़ेस लिख रहे हैं जो किसी ब्राउज़र में प्रदान किया जाना है; सभी इंटरफ़ेस का काम रिएक्ट में होता है, न कि "यदि आप एक वेब पेज लिख रहे हैं तो इसका क्या उपयोग किया जाता है" (यह इसलिए कि रिएक्ट ऐप "ऐप" हैं, "वेब पेज" नहीं)।
रिएक्ट एप्लिकेशन दो चीजों के आधार पर प्रस्तुत किए जाते हैं:
- जो भी माता-पिता द्वारा घोषित घटक के गुण उस घटक का एक उदाहरण बनाता है, जिसे माता-पिता अपने जीवन चक्र में संशोधित कर सकते हैं, और
- घटक की अपनी आंतरिक स्थिति, जिसे वह स्वयं अपने जीवनचक्र में संशोधित कर सकता है।
जब आप प्रतिक्रिया का उपयोग नहीं करते हैं, तो आप HTML तत्वों को उत्पन्न कर रहे हैं और फिर उन का उपयोग करके स्पष्ट रूप से नहीं कर रहे हैं: जब आप प्रतिक्रिया का उपयोग करने <input>
के लिए कहते हैं, उदाहरण के लिए, आप एक HTML इनपुट तत्व नहीं बना रहे हैं, तो आप प्रतिक्रिया को एक इनपुट इनपुट ऑब्जेक्ट बनाने के लिए कह रहे हैं HTML इनपुट तत्व के रूप में रेंडर करने के लिए होता है , और जिसका ईवेंट हैंडलिंग दिखता है, लेकिन HTML तत्व के इनपुट इवेंट द्वारा नियंत्रित नहीं किया जाता है।
प्रतिक्रिया का उपयोग करते समय, आप जो कर रहे हैं वह एप्लिकेशन UI तत्वों को उत्पन्न कर रहा है जो उपयोगकर्ता को (अक्सर जोड़-तोड़ करने वाले) डेटा के साथ पेश करते हैं, उपयोगकर्ता इंटरैक्शन के साथ घटक की स्थिति को बदलते हैं, जिससे नए एप्लिकेशन को प्रतिबिंबित करने के लिए आपके एप्लिकेशन इंटरफ़ेस के हिस्से का एक रेंडर हो सकता है। इस मॉडल में, राज्य हमेशा अंतिम प्राधिकरण होता है, न कि "जो भी यूआई लाइब्रेरी इसे रेंडर करने के लिए उपयोग किया जाता है", जो वेब पर ब्राउज़र का DOM है। इस प्रोग्रामिंग मॉडल में DOM का लगभग नामोनिशान है: यह सिर्फ यूआई फ्रेमवर्क है जो रिएक्ट का उपयोग करता है।
तो इनपुट तत्व के मामले में, तर्क यह है:
- आप इनपुट तत्व में टाइप करते हैं,
- आपके इनपुट तत्व के बारे में अभी तक कुछ नहीं हुआ है, इस घटना को रिएक्ट ने रोक दिया और तुरंत मार दिया ,
- इवेंट हैंडलिंग के लिए आपके द्वारा सेट किए गए फ़ंक्शन के लिए आगे की ओर प्रतिक्रिया करें,
- वह फ़ंक्शन राज्य अद्यतन को शेड्यूल कर सकता है ,
- यदि ऐसा होता है, तो रिएक्ट उस राज्य अपडेट को चलाता है (एसिंक्रोनस रूप से!) और
render
अपडेट के बाद कॉल को ट्रिगर करेगा , लेकिन केवल तभी जब स्टेट अपडेट ने राज्य को बदल दिया ।
- यह रेंडर होने के बाद ही यूआई दिखाएगा कि आपने "एक पत्र टाइप किया है"।
यह सब मिलिसेकंड के एक मामले में होता है, यदि कम नहीं है, तो ऐसा लगता है कि आपने इनपुट तत्व में उसी तरह से टाइप किया है जिस तरह से आप "सिर्फ एक पृष्ठ पर एक इनपुट तत्व का उपयोग कर रहे हैं", लेकिन यह बिल्कुल वैसा नहीं है हो गई।
तो, उस के साथ कहा, कैसे प्रतिक्रिया में तत्वों से मूल्यों को प्राप्त करने के लिए:
15 और नीचे, ES5 के साथ प्रतिक्रिया करें
चीजों को ठीक से करने के लिए, आपके घटक का एक राज्य मान है, जो एक इनपुट फ़ील्ड के माध्यम से दिखाया गया है, और हम इसे अपडेट कर सकते हैं कि UI तत्व घटक में परिवर्तन की घटनाओं को वापस भेजते हैं:
var Component = React.createClass({
getInitialState: function() {
return {
inputValue: ''
};
},
render: function() {
return (
//...
<input value={this.state.inputValue} onChange={this.updateInputValue}/>
//...
);
},
updateInputValue: function(evt) {
this.setState({
inputValue: evt.target.value
});
}
});
इसलिए हम रिएक्ट को updateInputValue
उपयोगकर्ता इंटरैक्शन को संभालने के लिए फ़ंक्शन का उपयोग setState
करने के लिए, स्टेट अपडेट को शेड्यूल करने के लिए उपयोग करने के लिए और इस तथ्य पर render
टैप करने का this.state.inputValue
मतलब बताते हैं कि जब यह राज्य को अपडेट करने के बाद रेंडर करता है, तो उपयोगकर्ता अपडेट किए गए टेक्स्ट को उनके द्वारा टाइप किए गए के आधार पर देखेंगे।
टिप्पणियों के आधार पर परिशिष्ट
यह देखते हुए कि यूआई इनपुट राज्य मूल्यों का प्रतिनिधित्व करते हैं (विचार करें कि क्या होता है यदि कोई उपयोगकर्ता अपने टैब मिडवे को बंद कर देता है, और टैब को पुनर्स्थापित किया जाता है। क्या उन सभी मूल्यों को जिन्हें वे बहाल करना चाहते हैं? यदि हां, तो वह राज्य है)। यह आपको महसूस करवा सकता है कि एक बड़े फॉर्म में दसियों या सौ इनपुट फॉर्म की जरूरत है, लेकिन रिएक्ट आपके यूआई को बनाए रखने योग्य तरीके से मॉडलिंग करने के बारे में है: आपके पास 100 स्वतंत्र इनपुट फ़ील्ड नहीं हैं, आपके पास संबंधित इनपुट के समूह हैं, इसलिए आप प्रत्येक पर कब्जा करते हैं। एक घटक में समूह और फिर समूहों के संग्रह के रूप में अपने "मास्टर" फॉर्म का निर्माण करें।
MyForm:
render:
<PersonalData/>
<AppPreferences/>
<ThirdParty/>
...
यह भी एक विशाल एकल फार्म घटक की तुलना में बनाए रखने के लिए बहुत आसान है। राज्य रखरखाव के साथ घटकों में समूहों को विभाजित करें, जहां प्रत्येक घटक एक समय में कुछ इनपुट फ़ील्ड को ट्रैक करने के लिए केवल जिम्मेदार होता है।
आपको यह भी महसूस हो सकता है कि यह सब कोड लिखने के लिए "एक परेशानी" है, लेकिन यह एक झूठी बचत है: डेवलपर्स-जो-आप-नहीं-भविष्य में आप भविष्य सहित, वास्तव में उन सभी इनपुटों को देखने से बहुत लाभान्वित होते हैं, क्योंकि स्पष्ट रूप से यह कोड पथ को ट्रेस करने के लिए बहुत आसान बनाता है। हालाँकि, आप हमेशा ऑप्टिमाइज़ कर सकते हैं। उदाहरण के लिए, आप एक स्टेट लिंकर लिख सकते हैं
MyComponent = React.createClass({
getInitialState() {
return {
firstName: this.props.firstName || "",
lastName: this.props.lastName || ""
...: ...
...
}
},
componentWillMount() {
Object.keys(this.state).forEach(n => {
let fn = n + 'Changed';
this[fn] = evt => {
let update = {};
update[n] = evt.target.value;
this.setState(update);
});
});
},
render: function() {
return Object.keys(this.state).map(n => {
<input
key={n}
type="text"
value={this.state[n]}
onChange={this[n + 'Changed']}/>
});
}
});
बेशक, इस के बेहतर संस्करण हैं, इसलिए https://npmjs.com पर हिट करें और एक रिएक्ट स्टेट लिंकिंग सॉल्यूशन की खोज करें जो आपको सबसे अच्छा लगे। ओपन सोर्स ज्यादातर दूसरों को पहले से ही पता लगाने के बारे में है, और उपयोग करने के बजाय खरोंच से खुद को सब कुछ लिखने के लिए।
प्रतिक्रिया 16 (और 15.5 संक्रमणकालीन) और 'आधुनिक' जेएस
16 रिएक्ट के रूप में (और 15.5 के साथ सॉफ्ट-स्टार्ट) createClass
कॉल अब समर्थित नहीं है, और क्लास सिंटैक्स का उपयोग करने की आवश्यकता है। यह दो चीजों को बदल देता है: स्पष्ट वर्ग वाक्य रचना, लेकिन यह भी this
संदर्भ बंधन जो createClass
"मुफ्त में" कर सकता है, इसलिए यह सुनिश्चित करने के लिए कि अभी भी काम करना सुनिश्चित करें कि आप "वसा तीर" संकेतन का उपयोग कर रहे हैं this
संदर्भ के लिए अनाम कार्यों में अनाम कार्यों को संरक्षित करना onWhatever
, जैसे onChange
कोड यहाँ हम उपयोग करें:
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
inputValue: ''
};
}
render() {
return (
//...
<input value={this.state.inputValue} onChange={evt => this.updateInputValue(evt)}/>
//...
);
},
updateInputValue(evt) {
this.setState({
inputValue: evt.target.value
});
}
});
आपने bind
अपने निर्माणकर्ता को अपने सभी ईवेंट हैंडलिंग कार्यों के लिए उनके निर्माण में उपयोग करते देखा होगा , जैसे:
constructor(props) {
super(props);
this.handler = this.handler.bind(this);
...
}
render() {
return (
...
<element onclick={this.handler}/>
...
);
}
ऐसा मत करो।
लगभग किसी भी समय आप उपयोग कर रहे हैं bind
, लौकिक "आप इसे गलत कर रहे हैं" लागू होता है। आपकी कक्षा पहले से ही वस्तु प्रोटोटाइप को परिभाषित करती है, और इसलिए पहले से ही उदाहरण के संदर्भ को परिभाषित करती है। bind
उस के ऊपर मत डालो ; कंस्ट्रक्टर में अपने सभी फ़ंक्शन कॉल को डुप्लिकेट करने के बजाय सामान्य ईवेंट फ़ॉरवर्डिंग का उपयोग करें, क्योंकि दोहराव आपकी बग सतह को बढ़ाता है, और त्रुटियों को ट्रेस करना बहुत कठिन बना देता है क्योंकि समस्या आपके कंस्ट्रक्टर में हो सकती है बजाय इसके कि आप अपने कोड को कहां से कॉल करें। काम करने के लिए दूसरों के साथ-साथ उन पर रखरखाव का बोझ रखें।
हां, मुझे पता है कि प्रतिक्रिया डॉक्स कहना ठीक है। यह नहीं है, यह मत करो।
हुक के साथ फ़ंक्शन घटकों का उपयोग करके 16.8 प्रतिक्रिया करें
रिएक्ट 16.8 के रूप में फंक्शन कंपोनेंट (यानी शाब्दिक रूप से सिर्फ एक फंक्शन जो कुछ props
को तर्क के रूप में लेता है, जैसे कि यह एक घटक वर्ग का एक उदाहरण हो सकता है, कभी क्लास लिखे बिना भी) हुक के उपयोग के माध्यम से राज्य दिया जा सकता है ।
यदि आपको पूर्ण श्रेणी कोड की आवश्यकता नहीं है, और एक एकल उदाहरण फ़ंक्शन करेगा, तो अब आप useState
हुक का उपयोग खुद को एक एकल राज्य चर प्राप्त करने के लिए कर सकते हैं , और इसका अद्यतन फ़ंक्शन, जो उपरोक्त उदाहरणों के बिना लगभग समान काम करता है, बिना setState
समारोह कॉल:
import { useState } from 'react';
function myFunctionalComponentFunction() {
const [input, setInput] = useState(''); // '' is the initial state value
return (
<div>
<label>Please specify:</label>
<input value={input} onInput={e => setInput(e.target.value)}/>
</div>
);
}
पहले वर्गों और फ़ंक्शन घटकों के बीच अनौपचारिक अंतर "फ़ंक्शन घटकों की स्थिति नहीं है", इसलिए हम उस एक के पीछे नहीं छिपा सकते हैं: फ़ंक्शन घटकों और कक्षाओं के घटकों के बीच का अंतर बहुत अच्छी तरह से कई पृष्ठों में फैल सकता है। -लेखित प्रतिक्रिया प्रलेखन (आपके लिए सुविधाजनक रूप से गलत व्याख्या करने के लिए कोई भी एक लाइनर स्पष्टीकरण नहीं है!) जिसे आपको पढ़ना चाहिए ताकि आप जान सकें कि आप क्या कर रहे हैं और इस प्रकार जान सकते हैं कि क्या आपने खुद को प्रोग्राम करने के लिए सबसे अच्छा (जो कुछ भी आपके लिए मतलब है) उठाया। आप कर रहे हैं एक समस्या से बाहर।
this.onSubmit.bind(this);