2017-11-28 2 views
0

Ich bekomme die folgende Warnung in der Konsole.Warum wird meine Komponente unmounten?

Warnung: Kann nur eine montierte oder montierte Komponente aktualisieren. Dies bedeutet normalerweise, dass Sie setState, replaceState oder forceUpdate für eine nicht bereitgestellte Komponente aufgerufen haben. Dies ist ein No-Op.

Bitte überprüfen Sie den Code für die ProgressBar-Komponente.

Es scheint mir, ist dies wegen der componentWillUnmount, die (unten sehen Konsolenausgabe) nach dem ersten componentDidMount passiert. Die passiert, bevor Daten vom Server angekommen sind. Wenn die Daten schließlich ankommen, versucht setState mit etwas unmounted zu arbeiten.

Aber warum gibt es eine dort? Ich würde erwarten, dass das Unmount nur passiert, nachdem setState aufgerufen wurde (und Daten vom Server angekommen sind). So würde die Komponente immer noch für setState zur Verfügung stehen.

class ProgressBar extends React.Component { 
    constructor(props) { 
     super(props); 
     this.state = { progress: 0 }; 
    } 

    loadProgressFromServer() { 
     let url = '/progress/' + this.props.topic_name; 
     console.log("LOADING progress FROM SERVER"); 
     $.ajax({ 
      url: url, 
      datatype: 'json', 
      cache: false, 
      success: function(data) { 
       console.log("finished loading from server"); 
       this.setState({ progress: data['progress'] }); 
      }.bind(this)   
     }) 
    } 

    componentDidMount() { 
     console.log("didmount"); 
     this.loadProgressFromServer(); 
    } 

    componentWillUnmount() { 
     console.log("willunmount"); 
    } 

    render() { 
     let progress = (this.state.progress * 100).toFixed(0); 
     return (
      <div className="progress" ref="pb"> 
       <div className="progress-bar" role="progressbar" aria-valuenow={ progress } aria-valuemin="0" aria-valuemax="100" style={{ width: progress +"%" }}> 
        { progress + "%" } 
       </div> 
      </div> 
     ) 
    } 
} 

Die Konsolenausgabe:

didmount 
LOADING progress FROM SERVER 
willunmount 
didmount 
LOADING progress FROM SERVER 
finished loading from server 
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 ProgressBar component. 
finished loading from server 

EDIT: Es gibt keine höhere Auftragskomponente.

ReactDOM.render(
    <ProgressBar topic_name='name of topic' />, 
    document.getElementById('progressbar') 
); 
+0

_ "Aber warum gibt es dort einen" Willensfall "?" Hast du es nicht dort hingelegt? – Andy

+0

Meine Frage ist, warum es ausgelöst wird. Warum wird die Komponente deaktiviert, bevor die AJAX-Anforderung abgeschlossen wird? – Andras

+0

Was macht die höhere Komponente? Für mich scheint es, dass ein Prozess, der sich von Ihrem ProgressBar unterscheidet, die ProgressBar-Komponente ausgliedert. Vielleicht ist es besser, dass Ihr Container den Ajax-Aufruf übernimmt und Ihre ProgressBar aktualisiert, ohne dass die Fortschrittsleiste tatsächlich weiß, was passiert – Schuere

Antwort

0

sehen, ob das hilft (die async: false beachten) - der Standardwert für async ist wahr, die Daten vom Server zurückkehrt, nachdem die Komponente wiedergegeben wird - Einstellung this.setState({ progress: data['progress'] }); bewirkt, dass das Warnmeldungen Sie bekommen

loadProgressFromServer() { 
     let url = '/progress/' + this.props.topic_name; 
     console.log("LOADING progress FROM SERVER"); 
     $.ajax({ 
      url: url, 
      async: false 
      datatype: 'json', 
      cache: false, 
      success: function(data) { 
       console.log("finished loading from server"); 
       this.setState({ progress: data['progress'] }); 
      }.bind(this)   
     }) 
    } 
+0

Dies löst das Problem. Warnung ist weg und unmount geschieht erst nach "fertig geladen von Server". Es wird abgeschrieben, aber es hilft immer noch viel zu verstehen, was vor sich geht. Es ist nicht sehr intuitiv für mich, wie 'setState' ausgelöst wird, bevor die Daten angekommen sind, denn 'Erfolg' würde nur ausgelöst werden, nachdem die Daten angekommen sind, hätte ich gedacht. – Andras

+0

Synchrone XHRs auf dem Hauptthread sind seit sehr langer Zeit veraltet. https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests – Adam

Verwandte Themen