Trace-warum Reagieren Komponente re-rendering
Ist es, einen systematischen Ansatz zu Debuggen, was die Ursache für eine Komponente zu re-render-in Reagieren? Ich habe eine einfache Konsole.log (), um zu sehen, wie viele Zeit es macht, aber ich habe Probleme, herauszufinden, was die Ursache für die Komponente " mehrere Male habe ich.e (4 mal) in meinem Fall. Gibt es ein tool, die vorhanden ist, zeigt eine Zeitleiste und/oder alle Komponenten-Baum rendert und bestellen?
- Vielleicht könnten Sie
shouldComponentUpdate
deaktivieren Sie die automatische update-Komponente und starten Sie dann die Spur aus. Mehr Informationen finden Sie hier: facebook.github.io/react/docs/optimizing-performance.html - Antwort ist korrekt. Im Allgemeinen Reagieren die stärken ist, dass Sie können leicht verfolgen Datenfluss sichern Sie die Kette, indem Sie sich den code. Reagieren DevTools-Erweiterung kann helfen. Auch habe ich eine Liste von nützliche tools für die Visualisierung/tracking Reagieren Komponente re-rendering als Teil des Redux addons Katalog, und eine Anzahl von Artikeln über [React performance-monitoring](htt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, eine kurze Schnipsel ohne externe Abhängigkeiten finde ich diese nützliche
Hier ist ein kleiner Haken ich verwenden, um trace-updates, um die Funktion der Komponenten
setState
Methode (in der Klasse Komponente) mitsetState(...args) { super.setState(...args) }
und dann legen Sie einen Haltepunkt im debugger, die Sie dann in der Lage sein zu gehen zurück auf die Funktion des Staates.Hier sind einige Instanzen, die ein Reagieren Komponente wird neu Rendern.
this.setState()
innerhalb der Komponente. Dies löst die folgenden Komponenten lifecycle-MethodenshouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
props
. Dies löstcomponentWillReceiveProps
>shouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
(connect
Methode derreact-redux
auslösen, das, wenn es zutreffend, änderungen in der Redux-store)this.forceUpdate
ähnlichthis.setState
Können Sie minimieren Ihre Komponente rerender durch die Implementierung des check in Ihrem
shouldComponentUpdate
und die Rückkehrfalse
wenn Sie es nicht müssen.Andere Möglichkeit ist die Verwendung
React.PureComponent
oder zustandslose Komponenten. Rein und zustandslose Komponenten nur neu Rendern, wenn es änderungen gibt es Requisiten.shouldComponentUpdate
oder erweiternReact.PureComponent
zu erzwingen, nur re-rendering ändern.const MyComponent = (props) => <h1>Hello {props.name}</h1>;
(das ist eine zustandslose Komponente). Es wird erneut Rendern, wenn die parent-Komponente neu gerendert.@jpdelatorre die Antwort ist groß, bei der Hervorhebung der Allgemeinen Gründe, warum ein Reagieren Komponente könnte erneut Rendern.
Ich wollte nur zu Tauchen ein wenig tiefer in eine Instanz: wenn Requisiten ändern. Fehlersuche, was dazu führt, dass ein Reagieren Komponente neu Rendern ist ein häufiges Problem, und in meiner Erfahrung oft aufspüren dieser Ausgabe geht es um die Requisiten verändern.
Reagieren Komponenten neu Rendern, wenn Sie erhalten neue Requisiten. Sie können erhalten neue Requisiten wie:
<MyComponent prop1={currentPosition} prop2={myVariable} />
oder wenn
MyComponent
ist verbunden mit einer redux-Shop:Jederzeit den Wert der
prop1
,prop2
,prop3
oderprop4
änderungenMyComponent
wird neu Rendern. Mit 4 props ist es nicht allzu schwer, die Spur, die Requisiten ändern, indem Sie einconsole.log(this.props)
an, dass Anfang desrender
block. Jedoch mit komplizierter, Komponenten und mehr und mehr Requisiten dieser Methode ist unhaltbar.Hier ist ein nützlicher Ansatz (mit lodash für die Bequemlichkeit), um zu bestimmen, welche prop-änderungen verursachen eine Komponente neu Rendern:
Hinzufügen dieses snippet um die Komponente kann helfen, enthüllen die Täter verursacht fragwürdigen re-rendert, und viele Male diese können Aufschluss auf unnötige Daten geleitet, in Komponenten.
UNSAFE_componentWillReceiveProps(nextProps)
und es ist veraltet. "Dieses Lebenszyklus-bisher unter dem NamencomponentWillReceiveProps
. Dieser name wird auch weiterhin funktionieren, bis version 17." Aus der Reagieren-Dokumentation.Gibt es nun den Haken für diese zur Verfügung auf npm:
https://www.npmjs.com/package/use-trace-update
(Disclosure, veröffentlicht habe ich es)
Den oben genannten Antworten sind sehr hilfreich, nur für den Fall, wenn jemand sucht für eine im folgenden finden Sie genauere Methode zum erkennen der Ursache von rerender dann fand ich diese Bibliothek redux-logger sehr hilfreich.
Was Sie tun können, ist fügen Sie die Bibliothek und aktivieren diff zwischen Staat(es gibt es in den docs) wie:
Hinzufügen und die middleware in der Filiale.
Dann legen Sie eine
console.log()
in der render-Funktion der Komponente, die Sie testen möchten.Dann starten Sie Ihre app, und überprüfen Sie für console-logs.Überall dort, wo es nur melden, bevor es Ihnen zeigen, den Unterschied zwischen Staat
(nextProps and this.props)
und Sie können entscheiden, ob die render wirklich notwendig ist esWird es Analog zum obigen Bild zusammen mit den diff-Taste.
Seltsamen niemand gegeben hat, die Antwort aber ich finde es sehr nützlich, vor allem, da die Requisiten, die änderungen sind fast immer zu tief geschachtelt sind.
Haken fanboys:
"Old"-school-fanboys:
P. S. ich immer noch lieber zu bedienen-HOC - (höhere order-Komponente), denn manchmal haben Sie destructured Ihre Requisiten an der Spitze und Jacob ' s Lösung passt nicht gut
Disclaimer: Keine Verbindung überhaupt mit dem Paket Besitzer. Nur einen Klick zig-mal um, um zu versuchen zu erkennen, den Unterschied in tief verschachtelten Objekten ist ein Schmerz in der.