Besseren Weg, um clearTimeout in componentWillUnmount
Ich habe einen Laden der Komponente, die bricht, wenn es wurde im laden für 8 Sekunden. Dieser code funktioniert, aber es fühlt sich aus mir und ich Frage mich, ob es gibt ein besserer Weg, dies zu tun.
Ohne Einstellung this.mounted
bekomme ich die Fehlermeldung:
Achtung: Kann nur aktualisieren montiert oder bei der Montage des Bauteils. Dies bedeutet in der Regel, die Sie genannt setState, replaceState oder forceUpdate auf einer nicht gemounteten Komponente. Dies ist ein no-op. Bitte überprüfen Sie den code für das Laden der Komponente.
Diese machen mich glauben, dass der timer wird nicht immer abgebrochen, so geht es weiter mit this.seState
. Warum wäre das, wenn ich clearTimeout
im componentWillUnmount
? Gibt es eine bessere Art das zu handhaben, als mit einem globalen this.mounted
?
class Loading extends Component {
state = {
error: false,
};
componentDidMount = () => {
this.mounted = true;
this.timer();
};
componentWillUnmount = () => {
this.mounted = false;
clearTimeout(this.timer);
};
timer = () =>
setTimeout(() => {
(this.mounted && this.setState({ error: true })) || null;
}, 8000);
render() {
const { showHeader = false } = this.props;
const { error } = this.state;
return (
<View style={backgroundStyle}>
{showHeader && <HeaderShell />}
{!error &&
<View style={loadingHeight}>
<PlatformSpinner size="large" />
</View>}
{error && <Error code="service" />}
</View>
);
}
}
Loading.propTypes = {
showHeader: PropTypes.bool,
};
Loading.defaultProps = {
showHeader: false,
};
export default Loading;
- Sie müssen speichern Sie das zurückgegebene Wert von
setTimeout()
irgendwo und pass, die inclearTimeout()
. Sie übergeben der Funktion die Referenz, die nicht funktionieren. - wie @Pointy erwähnt, müssen Sie speichern den zurückgegebenen Wert von setTimeout. Dieses wird gesagt, mit der
componentWillUnmount
lifecycle-Methode ist der bevorzugte Ort, um diese operation - Der zurückgegebene Wert von setTimeout wird durch die Einstellung des Staates, die ich nicht tun will, es sei denn, ich habe erreicht 8 Sekunden.
- der return-Wert von setTimeout ist eine timerId zum deaktivieren der Zeitüberschreitung.
this.timeout = setTimeout(...)
und dannclearTimeout(this.timeout)
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Spitz sagte, ist es nicht. Du bist die übergabe eines Funktion (
this.timer
) inclearTimeout
. Sie müssen übergeben Sie diesetTimeout
Rückgabewert (das handle des Timers), so können Sie diesen Griff, um es zu annullieren.In einer einfachen componennt, ich sehe nicht die Notwendigkeit für die
timer
Funktion, es erhöht nur die Komplexität, ich würde einfach den timer im CDM:Aber wenn dort mehr Logik, als gezeigt, oder einfach nur persönliche Präferenz, ja, getrennte Funktionen sind gut:
this.timerHandle = 0;
0
ist ein Ungültiger Wert für einen timer-handle). Macht auch für eine bequeme flag (siehe die Umsetzung vonclearTimer
). Und in der zweiten code-block, wosetTimer
undclearTimer
sind verschiedene Methoden, die Sie würde wollen, dass der check-insetTimer
.Müssen Sie klar mit den zurückgegebenen Wert aus
setTimeout
(siehe unten). Allerdings tunclearTimeout
imcomponentWillUnmount
ist eine richtige Weg, es zu tun, ich habe nicht gesehen, jeder macht es anders.Reagieren 16.3: diese Lösung war für mich, der anothers solutios nicht in meinem Fall: