2017-12-27 6 views
0

Ich habe ein Szenario, in dem ich Daten von api bekomme. In diesem Fall wird meine KomponenteWillReceiveProps() ausgelöst, wenn ich einen neuen Wert aus dem Speicher erhalte.Leistungsvergleich this.setState (this.state) und this.setState ({})

componentWillReceiveProps(newProps){ 
    if(newProps.listOne){ 
    this.state.listOne = newProps.listOne; 
    } 
    if(newProps.listTwo){ 
    this.state.listTwo = newProps.listTwo; 
    } 

    this.setState(this.state); 

} 

Jetzt nach react doc ist es unangemessen zu verwenden this.setState (this.state);

zu halten, so dass die Art und Weise im Auge 1

componentWillReceiveProps(newProps){ 
    if(newProps.listOne){ 
    this.setState({listOne : newProps.listOne}); 
    } 
    if(newProps.listTwo){ 
    this.setState({listTwo : newProps.listTwo}); 
    } 

} 

In Fall wäre Zustand zu aktualisieren meine nur einmal wird ausgelöst Render, nachdem ich alle Daten in den Zustand kopiert haben. In Fall 2 werden mein render (und alle dazwischen liegenden Lebenszyklen) ausgelöst, jedes Mal, wenn meine If-Bedingung erfüllt wird.

Also ich verstehe nicht, wie es meine Leistung verbessert. Sagen wir, wir sprechen über nicht eine, aber viele bedingte Zustandsaktualisierung.

+0

Bitte geben Sie Feedback zu der Antwort, die Sie erhalten haben; ob das ein »Das löst mein Problem nicht« oder es als akzeptiert markieren. –

Antwort

1

Wenn Sie setState rufen nur einmal möchten, können Sie es wie folgt tun:

componentWillReceiveProps(newProps) { 
    // Copy the state instead of mutating this.state directly. 
    const state = { ...this.state }; 

    if (newProps.listOne) { 
     state.listOne = newProps.listOne; 
    } 

    if (newProps.listTwo) { 
     state.listTwo = newProps.listTwo; 
    } 

    this.setState(state); 
} 

Sie können hier weiter verbessern, indem sie mit Hilfe von Bibliotheken wie Immuable.js wirklich unveränderlich Datenstrukturen verwenden.

Das manuelle Batch-Update solcher Updates ist jedoch unter dem Gesichtspunkt der Leistung nicht erforderlich. Reagieren Sie intern diese Updates intern, da dies ein Lebenszyklus-Hook ist. Es kann jedoch sinnvoll sein, wenn Sie den Rückruf von setState verwenden möchten.

+0

Hallo, die Lösung, die Sie bereitgestellt haben, um eine tiefe Kopie des Zustands zu erstellen, wird die Leistung weiter verringern, da jetzt das gesamte virtuelle DOM durch ein neues virtuelles DOM ersetzt wird, anstatt die Referenz des Zustands wie in einem früheren Fall zu aktualisieren. – Rishabh

+0

Es ist keine tiefe Kopie. Aber egal, meine Antwort bestand aus mehr als das. Zum Beispiel die Information, dass mehrere setState-Aufrufe von React zusammengefügt werden. –

Verwandte Themen