refs
का उपयोग नहीं सबसे अच्छा अभ्यास है क्योंकि यह डोम पढ़ता सीधे, यह प्रतिक्रिया के state
बजाय उपयोग करना बेहतर है है। साथ ही, आपका बटन नहीं बदलेगा क्योंकि घटक को फिर से प्रस्तुत नहीं किया जाता है और इसकी प्रारंभिक स्थिति में रहता है।
आप setState
एक साथ उपयोग कर सकते हैं एक onChange
घटना श्रोता के साथ फिर से हर बार इनपुट क्षेत्र परिवर्तन घटक रेंडर करने के लिए:
// Input field listens to change, updates React's state and re-renders the component.
<input onChange={e => this.setState({ value: e.target.value })} value={this.state.value} />
// Button is disabled when input state is empty.
<button disabled={!this.state.value} />
यहाँ एक काम कर उदाहरण है:
class AddItem extends React.Component {
constructor() {
super();
this.state = { value: '' };
this.onChange = this.onChange.bind(this);
this.add = this.add.bind(this);
}
add() {
this.props.onButtonClick(this.state.value);
this.setState({ value: '' });
}
onChange(e) {
this.setState({ value: e.target.value });
}
render() {
return (
<div className="add-item">
<input
type="text"
className="add-item__input"
value={this.state.value}
onChange={this.onChange}
placeholder={this.props.placeholder}
/>
<button
disabled={!this.state.value}
className="add-item__button"
onClick={this.add}
>
Add
</button>
</div>
);
}
}
ReactDOM.render(
<AddItem placeholder="Value" onButtonClick={v => console.log(v)} />,
document.getElementById('View')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='View'></div>
स्रोत
2017-01-05 15:40:51
यह सही जवाब है! इनपुट के परिवर्तन पर अपडेट करने के लिए आंतरिक स्थिति का उपयोग किया जाना चाहिए और बटन को इसके खिलाफ जांच करनी चाहिए। +1 –
this.state की एक सीमा है कि यह यूआई को फिर से प्रस्तुत करता है ताकि यदि आप किसी बच्चे के घटक में टेक्स्ट बॉक्स में टाइप कर रहे हों और ऑन चेंज ईवेंट से बंधे हों, तो यह टेक्स्टबॉक्स से फोकस खो देता है। यदि यह एक ही घटक में है तो यह ठीक है लेकिन जब बच्चे के घटक में उपयोग किया जाता है तो यह फोकस खो देता है। – Dynamic
@ गतिशील ऐसा नहीं होना चाहिए। क्या आपके पास इसका एक उदाहरण है? –