2017-03-28 16 views
5

मैं मूल देशी, प्रतिक्रिया.जेएस, और जावास्क्रिप्ट प्रतिक्रिया में एक पूर्ण नौसिखिया हूँ। मैं एंड्रॉइड डेवलपर हूं इसलिए आरएन को एक कोशिश देना चाहूंगा।यह देशी कैसे प्रतिक्रिया मूल में अपरिभाषित है?

असल में, अंतर onPress में है;

इस कोड से पता चलता 'undefined' जब टॉगल() चलाता है:

class LoaderBtn extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { loading: false }; 
    } 

    toggle() { 
     console.log(this.state); 
     // let state = this.state.loading; 
     console.log("Clicked!") 
     // this.setState({ loading: !state }) 
    } 

    render() { 
     return (
      <Button style={{ backgroundColor: '#468938' }} onPress={this.toggle}> 
       <Text>{this.props.text}</Text> 
      </Button> 
     ); 
    } 
} 

लेकिन इस कोड काम करता है:

class LoaderBtn extends Component { 
    constructor(props) { 
     super(props); 
     this.state = { loading: false }; 
    } 

    toggle() { 
     console.log(this.state); 
     // let state = this.state.loading; 
     console.log("Clicked!") 
     // this.setState({ loading: !state }) 
    } 

    render() { 
     return (
      <Button style={{ backgroundColor: '#468938' }} onPress={() => {this.toggle()}}> 
       <Text>{this.props.text}</Text> 
      </Button> 
     ); 
    } 
} 

तुम मुझे अंतर, कृपया व्याख्या कर सकते हैं?

जावा/Kotlin हम विधि संदर्भ है, मूल रूप से यह समारोह गुजरता है, तो हस्ताक्षर, एक ही हैं onPress =() => {} और toggle =() => {}

लेकिन जे एस में यह काम नहीं करता :(

उत्तर

12

मुद्दा यह है कि पहला उदाहरण toggle() में सही this करने के लिए बाध्य नहीं है।

आप ctor में यह बाध्य कर सकते हैं या तो:

constructor(props) { 
    super(props); 
    this.toggle = this.toggle.bind(this); 
    ... 

या उपयोग करें एक उदाहरण समारोह (ठीक कुछ परिस्थितियों में):

toggle =() => { 
    ... 
} 

यह दृष्टिकोण stage-2 या transform-class-properties के माध्यम से परिवर्तन का निर्माण की आवश्यकता है।

उदाहरण संपत्ति कार्यों के साथ चेतावनी यह है कि प्रति-घटक एक फ़ंक्शन बनाया गया है। यह ठीक है अगर पृष्ठ पर उनमें से कई नहीं हैं, लेकिन यह ध्यान में रखना कुछ है।

यह मूल जेएस है; this article regarding React Binding Patterns मदद कर सकता है।

+0

यह आलेख बिल्कुल वैसा ही है जो मुझे समझने की आवश्यकता है कि क्या हो रहा है। एकमात्र प्रश्न यह प्रति घटक तत्कालता के बाद बनाया गया है? –

+0

मेरा मतलब है, मुझे वास्तव में उस संपत्ति वाक्यविन्यास पसंद है, लेकिन क्या यह प्रदर्शन को प्रभावित करता है? –

+0

@ निकक्रैव \t निर्भर करता है। पृष्ठ पर सैकड़ों घटक नहीं होने पर किसी भी सार्थक तरीके से नहीं। सामान्य जेएस में काफी तेज़ है, और कई अन्य प्रतिक्रिया अनुकूलन हैं जो इससे अधिक प्रभावशाली होंगे (उदा।, 'चाहिएकंपोनेंट अपडेट करें' टाइप करें)। –

2

तरह मुझे लगता है क्या है हो रहा दायरे की बात कर रहा है। जब आप onPress={this.toggle} का उपयोग यह है कि क्या आप अपने टॉगल समारोह में उम्मीद कर रहे हैं नहीं है। हालांकि, तीर कार्यों अलग व्यवहार प्रदर्शन और स्वचालित रूप से this करने के लिए बाध्य है। आप onPress={this.toggle.bind(this)} उपयोग कर सकते हैं।

furthe आर पढ़ने -

ES6 Arrow Functions

.bind()

+1

सामान्य रूप से आप 'रेंडर' के दौरान नए कार्यों को नहीं बनाना चाहते हैं। इसके बजाय ctor में बाध्य करें या एक इंस्टेंस प्रॉपर्टी फ़ंक्शन का उपयोग करें जो स्वचालित रूप से बाध्य है। –

+0

हां, उत्कृष्ट बिंदु। यदि आप अपने प्रस्तुत करने में तीर फ़ंक्शन का उपयोग करते हैं, तो यह हर बार एक नया फ़ंक्शन बना रहा है। मुझे लगता है कि रिएक्ट डॉक्स भी सिफारिश करते हैं। बाइंड() – larz

1

इस पहले उदाहरण में क्या हो रहा है यह है कि आपने "इस" का दायरा खो दिया है। आम तौर पर मैं क्या इसलिए की तरह निर्माता में मेरे सभी कार्यों को परिभाषित करने के लिए है:

constructor(props) { 
    super(props); 
    this.state = { loading: false }; 
    this.toggle = this.toggle.bind(this); 
} 

दूसरे उदाहरण में, आप ES6 सिंटैक्स का उपयोग कर रहे हैं, जो स्वत: इस बाँध होगा (जिसके कारण यह काम करता है)।

फिर आपके अंदर प्रेस फ़ंक्शन पर, आपको बनाए गए फ़ंक्शन को कॉल करने की आवश्यकता है।तो यह ऐसा कुछ दिखाई देगा,

onPress={this.toggle} 
+1

मुझे लगता है कि आप 'this.toggle' चाहते हैं, अन्यथा इसे प्रस्तुत किए जाने पर निष्पादित किया जाएगा। –

+0

मैं इसे आपके लिए संपादित कर दूंगा। –

संबंधित मुद्दे