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 in clearTimeout(). 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 dann clearTimeout(this.timeout).
Schreibe einen Kommentar