तो मैं एक बड़ा घटक है कि मेरे प्रपत्र हो जाएगा:प्रतिक्रिया प्रपत्र एक फ्लक्स स्टोर (? सर्वश्रेष्ठ अभ्यास) द्वारा नियंत्रित
<form>
<FirstComponent value={this.state.firstValue}/>
<SecondComponent value={this.state.secondValue}/>
{more components here}
<input type="submit" ... />
</form>
यह फार्म घटक एक दुकान है कि firstAction
का उपयोग कर अपने मूल्यों को अद्यतन करता है के लिए सुन रहा है, secondAction
, आदि
नोट: घटक) अपने राज्य store.getState (के आधार पर कि {firstValue: something, secondValue: something, etc}
रिटर्न अद्यतन करता है तो मान लीजिए कि मेरी FirstComponent
एक इनपुट है करते हैं:
<input type="text" value={this.props.value}
onChange={(e)=>this.props.firstAction(e.target.value)}
</input>
ठीक है, तो onChange
आग प्रोप firstAction
जो वास्तव में है कि मेरी दुकान अपडेट हो जाएगा और फार्म के लिए फिर से प्रस्तुत करना बनाने फ्लक्स कार्रवाई है। मेरे पास दो अच्छी चीजें हैं, जब उपयोगकर्ता फॉर्म सबमिट करता है, तो मैं अपने स्टोर में फर्स्ट कॉम्पोनेंट का मान देख सकता हूं और मैं अपने सभी राज्य को मूल घटक से भी नियंत्रित करता हूं।
हालांकि, इस onChange
कॉलबैक एक कार्रवाई हर बार उपयोगकर्ता प्रकार एक चरित्र कॉल करेंगे (इसलिए यह उत्पादन कर सकते हैं कॉल का एक बहुत इसलिए फिर से renders) < - इस गंभीर प्रदर्शन के मुद्दों को भड़काने कर सकते हैं?
इसके बजाय, मैं रेफरी का उपयोग कर सकता हूं और जब उपयोगकर्ता सबमिट बटन दबाता है, तो this.refs.myFirstComponent.state
प्राप्त करें ... और मेरे पास भी मूल्य होगा (यह Uncontrolled Component होगा?) लेकिन यह समुदाय से अनुशंसा की तरह नहीं लगता है।
तो मेरा सवाल यह है कि, क्या पहला दृष्टिकोण है जिसे मैंने जाने के लिए एक अच्छा तरीका बताया है? मैं इसे कैसे अनुकूलित कर सकता हूं? तो फिर से प्रस्तुत करना चाहिए कि केवल FirstComponent को प्रभावित करना चाहिए दूसरा कॉम्पोनेंट नहीं करता है और फिर पुनः प्रस्तुत करने के लिए? shouldComponentUpdate
यहां जाने का एकमात्र तरीका है?
संपादित करें 1: http://webdriver.io/api/action/setValue.html
मैं डॉन:
पहले दृष्टिकोण मैं एक समस्या का सामना करना पड़ रहा के साथ ... मैं पाठ फ़ील्ड में मान जोड़ने WebdriverIO का उपयोग कर एक E2E परीक्षण पता नहीं क्यों, लेकिन अगर मैं इनपुट में "परीक्षण" शब्द जोड़ने की कोशिश कर रहा हूं, तो वेबड्राइवर केवल अंतिम अक्षर जोड़ देगा। अगर यह स्थिति राज्य/स्टोर का उपयोग नहीं कर रही है तो यह समस्या चली गई है। हालांकि, अगर मैं अपने FirstComponent
को आंतरिक रूप से राज्य है, कुछ की तरह:
<input type="text" value={this.state.value}
onChange={(e)=>this.setState({firstValue: e.target.value})}
onBlur={()=>this.props.callback(this.state.firstValue)}
</input>
इस मामले में, घटक, जबकि (केवल खुद renders) टाइपिंग तेजी से प्रतिक्रिया करने के लिए, जब उपयोगकर्ता ध्यान केंद्रित यह स्टोर की नई जानकारी को हटा रहा है, और उसके बाद । मुझे कहना है, मुझे इस दृष्टिकोण को पसंद नहीं है क्योंकि यह आपके राज्य को लेने के पैटर्न का पालन नहीं करता है (और मुझे लगता है कि मैं राज्य को डुप्लिकेट कर रहा हूं) लेकिन ऐसा लगता है कि यह तेजी से और अधिक महत्वपूर्ण काम करता है: मेरा ई 2 टेस्ट काम करता है। कोई और विचार?
मेरे ई 2 परीक्षणों के साथ समस्या का सामना करने के लिए कार्रवाई दृष्टिकोण का उपयोग करके मेरा संपादन 1 देखें ... –
यह प्रदर्शन समस्याओं का कारण क्यों होगा? मैंने सोचा कि प्रतिक्रिया का वर्चुअल डोम आंतरिक रूप से ऐसे चेक को संभालता है और केवल प्रस्तुत करता है, क्या बदल गया है। जब प्रदर्शन की बात आती है, तो यह प्रतिक्रिया की उल्लेखनीय विशेषता है। क्या मै गलत हु? – Alex