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:
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
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.
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);
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.
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
„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.
Erich Wiener
Falls es jemand möchte, können Sie den Timer auch asynchron machen und darauf warten:
// do something
await delay(500); // wait 0.5 seconds
// do something else
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:
Ü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 verwendetrender
-Methode und dies wird ein neues Timeout für jedes Rendern erstellen … Erstellen von Nebeneffekten im Innerenrender
ist ein Antimuster. Der Rest ist schon beantwortet– Kidroka
20. April 2021 um 16:36 Uhr