ReactJS - Nicht Rendern aufgerufen werden, zu jeder Zeit "setState" genannt wird?

Nicht Reagieren, re-Rendern-alle Komponenten und sub-Komponenten jedes mal, wenn setState genannt wird?

Wenn ja, warum? Ich dachte, die Idee war, die Reagieren nur dadurch so wenig wie nötig - wenn sich der Zustand geändert.

Im folgenden an einem einfachen Beispiel, beide Klassen Rendern Sie erneut, wenn der text angeklickt wird, trotz der Tatsache, dass der Zustand nicht ändern auf den nachfolgenden Klicks, wie der onClick-handler setzt immer die state auf den gleichen Wert:

this.setState({'test':'me'});

Ich hätte erwartet, dass die macht würde nur passieren, wenn state Daten geändert hatte.

Hier ist der code für das Beispiel wie eine JS-Fiddle - und embedded-snippet:

JS:

var TimeInChild = React.createClass({
    render: function() {
        var t = new Date().getTime();

        return (
            <p>Time in child:{t}</p>
        );
    }
});

var Main = React.createClass({
    onTest: function() {
        this.setState({'test':'me'});
    },

    render: function() {
        var currentTime = new Date().getTime();

        return (
            <div onClick={this.onTest}>
            <p>Time in main:{currentTime}</p>
            <p>Click me to update time</p>
            <TimeInChild/>
            </div>
        );
    }
});

ReactDOM.render(<Main/>, document.body);

HTML:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react-dom.min.js"></script>

[1]: http://jsfiddle.net/fp2tncmb/2/
  • Ich hatte das gleiche Problem, ich weiß nicht die genaue Lösung. Aber ich aufgeräumt hatte, den unerwünschten codes aus der Komponente es begann wie üblich.
  • Ich möchte darauf hinweisen, dass in deinem Beispiel - denn wie Ihr element ist entworfen, nicht ausschließlich verlassen Sie sich auf eine einzigartige state - Aufruf setState() auch mit dummy-Daten führt dazu, dass das element gerendert, so würde ich sagen, ja. Absolut sollte es versuchen, re-Rendern Sie Ihr Objekt, wenn Sie etwas verändert haben könnte, weil sonst Ihre demo - vorausgesetzt, es war bestimmt das Verhalten - nicht funktionieren würde!
  • Du magst Recht haben @TadhgMcDonald-Jensen - aber aus meinem Verständnis Reagieren würde gerendert haben es das erste mal (da sich der Zustand ändert sich von nichts zu etwas, das erste mal), dann hatte nie Rendern Sie erneut. Ich war falsch, obwohl, natürlich - wie es aussieht Reagieren erfordert, dass Sie schreiben Sie Ihre eigenen shouldComponentUpdate Methode, die ich davon ausgegangen, eine einfache version muss es schon vorhanden Reagieren selbst. Klingt wie die Standard-version enthalten, reagieren einfach zurück true - die Kräfte, die Komponente neu Rendern jedes einzelne mal.
  • Ja, aber es muss nur neu Rendern in der virtuellen DOM dann, es ändert sich nur der eigentliche DOM, wenn die Komponente gerendert wird anders. Updates der virtuellen DOM sind in der Regel vernachlässigbar (zumindest im Vergleich zu ändern, die Dinge auf dem Bildschirm) so aufrufen Rendern jeder Zeit müssen Sie möglicherweise zu aktualisieren, dann zu sehen, dass keine Veränderung passiert nicht sehr teuer und sicherer als die Annahme, es Rendern soll, die gleiche.
InformationsquelleAutor Brad Parks | 2014-07-13
Schreibe einen Kommentar