2015-12-29 10 views
23

मैं प्रतिक्रिया मूल में निर्मित आईओएस ऐप के लिए एक स्प्लैश स्क्रीन लोड करने का प्रयास कर रहा हूं। मैं कक्षा राज्यों के माध्यम से यह पूरा करने के तो इस प्रकार एक setTimeout सुविधा कोशिश कर रहा हूँ और:प्रतिक्रिया मूल में सेटटाइम

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

    render() { 
    setTimeout(function(){this.setState({timePassed: true})}, 1000); 
    if (!this.state.timePassed){ 
     return <LoadingPage/>; 
    }else{ 
     return (
     <NavigatorIOS 
      style = {styles.container} 
      initialRoute = {{ 
      component: LoginPage, 
      title: 'Sign In', 
      }}/> 
    ); 
    } 
    } 
} 

पृष्ठ लोड एक पल के लिए काम करता है, और उसके बाद मैं जब setTimeout सच करने के लिए राज्य को बदलने की कोशिश करता है लगता है, मेरे प्रोग्राम दुर्घटनाग्रस्त: 'अपरिभाषित एक वस्तु नहीं है (इस .setState का मूल्यांकन)'। मैं इसे कुछ घंटों तक चला रहा हूं, इसे ठीक करने के तरीके पर कोई विचार?

उत्तर

8

सेटटाइम के लिए एक नया फ़ंक्शन लिखें। कृपया इसे आज़माएं।

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

componentDidMount() { 
    this.setTimeout(() => { 
    this.setTimePassed(); 
    },1000); 
} 

setTimePassed() { 
    this.setState({timePassed: true}); 
} 


render() { 

if (!this.state.timePassed){ 
    return <LoadingPage/>; 
}else{ 
    return (
    <NavigatorIOS 
     style = {styles.container} 
     initialRoute = {{ 
     component: LoginPage, 
     title: 'Sign In', 
     }}/> 
); 
} 
} 
} 
+0

ठीक है, यह काम करता है - धन्यवाद! क्या आप संभवतः समझा सकते हैं कि यह प्रस्तुत करने में क्यों काम नहीं कर रहा था? – Phil

+0

मुझे लगता है कि आप प्रस्तुत करने के तरीके में कोई भी निर्देश नहीं लिख सकते हैं। आप स्टार्टअप निर्देशों के लिए घटक WillMount या घटकDidMount फ़ंक्शन का उपयोग कर सकते हैं। – Phyo

+4

यह एक स्कोपिंग मुद्दे के कारण काम नहीं कर रहा था। आपके मूल कोड में आपने सेटटाइनआउट (फ़ंक्शन() {था जो उस ब्लॉक में यह आपके घटक को किसी अन्य चीज़ से संदर्भित करता है। यहां जवाब का एक विकल्प केवल आपके सेटटाइमआउट कॉल को "ES2015 फैट एरो सिटैक्स" में बदलना होगा : setTimeout (() => this.setState ((...) – rmevans9

62

क्लासिक जावास्क्रिप्ट गलती।

setTimeout(function(){this.setState({timePassed: true})}, 1000) 

जब setTimeoutthis.setState चलाता है, this नहीं रह गया है CowtanApp, लेकिन window है। यदि आप => नोटेशन के साथ फ़ंक्शन को परिभाषित करते हैं, तो es6 this ऑटो-बाइंड करेगा।

setTimeout(() => {this.setState({timePassed: true})}, 1000) 

वैकल्पिक रूप से, आप अपने संदर्भ के लिए अपने render के शीर्ष पर एक let that = this; इस्तेमाल कर सकते हैं, तो स्विच स्थानीय चर का उपयोग करने के लिए।

render() { 
    let that = this; 
    setTimeout(function(){that.setState({timePassed: true})}, 1000); 
+0

धन्यवाद। अच्छा स्पष्टीकरण! – lwpro2

+0

मुझे बचाया, धन्यवाद! मैं जेएस के लिए नया हूं, यह मूर्खतापूर्ण हो सकता है लेकिन क्या ऐसा करने का कोई तरीका है "पारंपरिक" समारोह() {} रास्ता? –

0

आप अपने समारोह परिभाषा के अंत करने के लिए सीधे .bind(this) जोड़कर अपने कार्य करने के लिए बाध्य कर सकते हैं this। आप अपने कोड ब्लॉक को फिर से लिखेंगे:

setTimeout(function() { 
    this.setState({ timePassed: true }); 
}.bind(this), 1000); 
संबंधित मुद्दे