Ich habe eine funktionierende Ladekomponente, die abgebrochen wird, wenn es für 8 Sekunden geladen wurde. Dieser Code funktioniert, aber es fühlt sich für mich an und ich frage mich, ob es einen besseren Weg dafür gibt.Bessere Möglichkeit zum Löschen von Timeout in ComponentWillUnmount
Ohne this.mounted
Einstellung erhalte ich die Fehlermeldung:
Warning: Can only update a mounted or mounting component. This usually means you called setState, replaceState, or forceUpdate on an unmounted component. This is a no-op. Please check the code for the Loading component.
Diese ich denke, dass der Timer nicht abgebrochen zu werden, so dass es mit this.seState
weiter. Warum würde das sein, wenn ich clearTimeout
ineinstelle? Gibt es einen besseren Weg, dies 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 den Wert speichern von 'setTimeout()' irgendwo zurück und übergebe das an 'clearTimeout()'. Sie übergeben diese Funktionsreferenz, die nicht funktioniert. – Pointy
wie @Pointy erwähnt, müssen Sie den von setTimeout zurückgegebenen Wert speichern. Das Verwenden der 'componentWillUnmount'-Lebenszyklusmethode ist der bevorzugte Ort, um diese Operation auszuführen –
Der von setTimeout zurückgegebene Wert setzt den Zustand, den ich nicht ausführen möchte, wenn ich 8 Sekunden nicht erreicht habe. – Turnipdabeets