2015-06-15 10 views
17

मुझे पता है कि पहले से ही एक समान प्रश्न है लेकिन वहां कोई कोड साझा नहीं किया गया है।प्रतिक्रिया-मूल यह .setState काम नहीं कर रहा

navbarChanged() के तहत> यदि स्थिति है, तो मैं this.setState कर रहा हूं। यह HomeTab प्रकार है लेकिन setState काम नहीं कर रहा है।

कोई संकेत/पॉइंटर्स?

render() { 
    return (
     <NavigatorIOS style={styles.container} 
      navigationBarHidden={this.state.isNavBarHidden} 
      ref="navigator" 
      initialRoute={{ 
       title: 'Foo', 
       component: HomeScreen, 
       passProps: { parent: this } 
      }} 
     /> 
    ) 
    } 

उत्तर

43

स्पष्ट render फोन नहीं है:

class HomeTab extends React.Component { 
    constructor() { 
    super() 

    this.setState({ 
     isNavBarHidden: false 
    }); 
    } 

    updatePosition(lastPosition) { 
    } 

    navbarChanged() { 
    console.log("received navbar changed event", AppStore.navbarVisible()); 

    if (AppStore.navbarVisible()) { 
     StatusBarIOS.setHidden(false) 
     this.setState({ isNavBarHidden: false}) 
     // this.state.isNavbarHidden is still true here 
     this.render(); 
    } 
    else { 
     StatusBarIOS.setHidden(true); 
     this.setState({ isNavBarHidden: true}); 
     this.render(); 
    } 
    } 

    componentDidMount() { 
    AppStore.addNavbarChangeListener(this.navbarChanged.bind(this)); 
    } 

    componentWillMount() { 
    StatusBarIOS.setHidden(false) 
    this.setState({ isNavBarHidden: false }); 
    } 
} 

और यहाँ मेरी प्रस्तुत करना() कोड है। जब राज्य या प्रोप बदलते हैं तो प्रतिक्रिया स्वचालित रूप से फिर से प्रस्तुत की जाएगी, इसलिए इसके लिए कोई आवश्यकता नहीं है। साथ ही, आपकी वास्तविक render विधि कहां है?

आपकी समस्या के लिए अच्छी तरह से, setState असीमित है और इसलिए setState कॉल के बाद सीधे स्थिति के साथ काम करने का प्रयास नहीं किया जाएगा क्योंकि अद्यतन आवश्यक रूप से चलाना आवश्यक नहीं होगा। इसके बजाय आप जो एक कॉलबैक है setState से पीछे तर्क का उपयोग कर सकते हैं:

this.setState({ myVal: 'newVal'}, function() { 
    // do something with new state 
}); 

के बाद राज्य स्थापित किया गया है यह ट्रिगर किया जाएगा और बाद घटक फिर से गाया गया है।

+1

आपके उत्तर के लिए बहुत बहुत धन्यवाद। 'सेटस्टेट' असीमित होने के कारण इस प्रश्न का उत्तर देता है। मैंने अपना कोड मेरे रेंडर विधि() के साथ अपडेट किया है। मैं रेंडर() से छुटकारा पाउंगा; आपने जो सुझाव दिया वह समझ में आता है। मैं अभी भी उलझन में हूं हालांकि मेरा नेविगेशन क्यों नहीं दिखा रहा है (लेकिन टाइटलबार है)। – Abdo

+1

वाह धन्यवाद - मुझे पता नहीं था कि सेटस्टेट एसिंक है - सेट से एटीएनसी - एफएआर से कई ऑनलाइन टट्स का कहना है कि यूआई इसे कॉल करने के बाद प्रस्तुत करेगा - यह तुरंत नहीं है और आपके उत्तर ने मुझे बड़े पैमाने पर मदद की है। धन्यवाद – landed

4

सेटस्टेट के बजाय, एएस 6 कक्षा के इंस्टेंस सदस्य के रूप में राज्य का उपयोग करें। आवश्यक सेट-रेंडर सुनिश्चित करने के लिए फ़ंक्शन सेटस्टेट को बाद में स्वयं कहा जा सकता है।

constructor() { 
    super() 

    this.state = { 
     isNavBarHidden: false 
    }; 
    } 
0

तुम भी eventHandlers में राज्य को अद्यतन करने और कोड है कि आप राज्य में परिवर्तन के बाद चलाने की आवश्यकता के लिए componentWillReceiveProps सुन सकते हैं।

componentWillReceiveProps(nextProps,nextState){ 
    if(this.state.myVar === nextState.myVar){ 
    return; 
    } 
    // TODO perform changes on state change 
} 

मुझे लगता है कि यह सब के रूप में तर्क render पहले ही आ जाते हैं इसके बाद के संस्करण कहा जाता हो जाता है ऊपर Colin Ramsay द्वारा दिए गए समाधान की तुलना में अधिक इष्टतम है।

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