setTimeout in React Native

Lesezeit: 3 Minuten

Ich versuche, einen Begrüßungsbildschirm für eine in React Native integrierte iOS-App zu laden. Ich versuche dies durch Klassenzustände und dann eine setTimeout-Funktion wie folgt zu erreichen:

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',
          }}/>
      );
    }
  }
}

Die Ladeseite funktioniert für eine Sekunde, und dann schätze ich, wenn setTimeout versucht, den Status auf „true“ zu ändern, stürzt mein Programm ab: „undefined is not an object (evaluating this.setState)“. Ich mache das seit ein paar Stunden, habt ihr eine Idee, wie ich das beheben kann?

  • Überprüfen Sie, ob die Zeit Ihres Geräts mit der Ihres Computers übereinstimmt! Das ist mir passiert und hat leider lange gedauert debug stackoverflow.com/questions/51163349/…

    – Mahdi Bashirpour

    3. Juli 2018 um 22:26 Uhr


  • Aus irgendeinem Grund kann ich nur das sehen setTimeout wird innerhalb der verwendet render -Methode und dies wird ein neues Timeout für jedes Rendern erstellen … Erstellen von Nebeneffekten im Inneren render ist ein Antimuster. Der Rest ist schon beantwortet

    – Kidroka

    20. April 2021 um 16:36 Uhr


Benutzer-Avatar
oliversisson

Klassischer Javascript-Fehler.

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

Wann setTimeout läuft this.setState, this ist nicht mehr CowtanAppaber window. Wenn Sie die Funktion mit der definieren => Notation wird es6 automatisch binden this.

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

Alternativ können Sie auch eine verwenden let that = this; an der Spitze Ihrer renderund wechseln Sie dann Ihre Referenzen, um die lokale Variable zu verwenden.

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

Wenn nicht funktioniert, verwenden bind.

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

  • Hat mich gerettet, danke! Ich bin neu in js, das mag albern sein, aber gibt es eine Möglichkeit, dies mit der “traditionellen” function(){}-Methode zu tun?

    – t-gao

    8. Dezember 2016 um 17:56 Uhr

  • Bitte erwähnen Sie, dass Sie normalerweise nicht anrufen würden setTimeout innerhalb der render Methode. Es ist ein React-Antimuster, um den Zustand zu ändern oder Nebeneffekte innerhalb des Renderns zu erzeugen. Außerdem wird für jeden Renderdurchgang ein neuer Timer erstellt

    – Kidroka

    20. April 2021 um 16:38 Uhr

Schreiben Sie eine neue Funktion für settimeout. Bitte versuchen Sie dies.

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',
      }}/>
  );
}
}
}

  • ok, das funktioniert – danke! Könnten Sie möglicherweise erklären, warum es beim Rendern nicht funktioniert hat?

    – Phil

    29. Dezember 2015 um 4:49 Uhr

  • Ich denke, Sie können in der Render-Methode überhaupt keine Anweisungen schreiben. Sie können die Funktion „componentWillMount“ oder „componentDidMount“ für Startanweisungen verwenden.

    – Pho

    29. Dezember 2015 um 5:02 Uhr

  • Es funktionierte wegen eines Scoping-Problems nicht. In Ihrem ursprünglichen Code hatten Sie setTineout(function() { was sich in diesem Block auf etwas anderes als Ihre Komponente bezieht. Eine Alternative zur Antwort hier wäre gewesen, einfach Ihren setTimeout-Aufruf in die “ES2015 Fat Arrow Sytax” zu ändern : setTimeout(() => this.setState((…)

    – rmevas9

    29. Dezember 2015 um 10:02 Uhr

const getData = () => {
// some functionality
}

const that = this;
   setTimeout(() => {
   // write your functions    
   that.getData()
},6000);

Einfache Settimout-Funktion wird nach 6000 Millisekunden ausgelöst

Benutzer-Avatar
Wandhi Zakari

Ändern Sie diesen Code:

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

Zu dem Folgendem:

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

Auf ReactNative .53 funktioniert Folgendes für mich:

 this.timeoutCheck = setTimeout(() => {
   this.setTimePassed();
   }, 400);

„setTimeout“ ist die ReactNative-Bibliotheksfunktion.
‘this.timeoutCheck’ ist meine Variable, um das Timeout-Objekt zu halten.
‘this.setTimePassed’ ist meine Funktion, die beim Timeout aufgerufen werden soll.

Benutzer-Avatar
Erich Wiener

Falls es jemand möchte, können Sie den Timer auch asynchron machen und darauf warten:

export const delay = (ms) => new Promise((res) => setTimeout(res, ms));

Verwendungszweck:

// do something
await delay(500); // wait 0.5 seconds
// do something else

Benutzer-Avatar
Scott Tischler

Sie können binden this zu Ihrer Funktion durch Hinzufügen .bind(this) direkt an das Ende Ihrer Funktionsdefinition. Sie würden Ihren Codeblock wie folgt umschreiben:

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

1136210cookie-checksetTimeout in React Native

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy