Was sollten Sie bei der Verwendung von React.setState beachten?
In diesem Artikel werden hauptsächlich drei Punkte vorgestellt, die bei der Verwendung von React.setState beachtet werden müssen. Es werden drei Punkte genannt, die für React-Neulinge leicht zu ignorieren sind. Es hat einen gewissen Referenzwert >
Vorwort
Der Originaltitel dieses Artikels lautet 3 Gründe, warum ich React.setState nicht mehr verwendet habe, aber die Argumente des ursprünglichen Autors interessieren mich nicht sehr. Aber die drei vom Autor angesprochenen Punkte sind für React-Neulinge leicht zu ignorieren, daher werde ich hier nur einen Teil des Inhalts erwähnen und den Titel in drei Punkte ändern, die bei der Verwendung von React.setState beachtet werden müssen.Text
Für React-Neulinge ist die Verwendung von setState eine sehr komplizierte Sache. Selbst wenn Sie ein erfahrener React-Entwickler sind, ist es sehr wahrscheinlich, dass aufgrund einiger Mechanismen von React einige Fehler auftreten, wie zum Beispiel das folgende Beispiel:Hinweis:
Ändern Sie this.state niemals direkt, da ein späterer Aufruf von setState() das ersetzen kann Änderungen, die Sie vorgenommen habenÄnderung. Behandeln Sie this.state als unveränderlich. setState() ändert this.state nicht sofort, sondern erstellt einen Zustandsübergang, der bald verarbeitet wird. Der Zugriff auf this.state nach dem Aufruf dieser Methode gibt möglicherweise den vorhandenen Wert zurück. Aufrufe an setState haben keine Synchronisierungsgarantien und Aufrufe können zur Leistungssteigerung gestapelt werden. setState() löst immer eine Neuzeichnung aus, es sei denn, die bedingte Rendering-Logik ist in ShouldComponentUpdate() implementiert. Wenn veränderliche Objekte verwendet werden und diese Logik nicht in ShouldComponentUpdate() implementiert werden kann, kann der Aufruf von setState() nur dann, wenn ein Unterschied zwischen dem neuen Zustand und dem vorherigen Zustand besteht, unnötiges erneutes Rendern vermeiden. Zusammenfassend lässt sich sagen, dass bei der Verwendung von setState drei Probleme zu beachten sind:1. setState ist asynchron (Anmerkung des Übersetzers: Synchronisierung ist nicht garantiert)
Vielen Entwicklern ist zunächst nicht aufgefallen, dass setState asynchron ist. Wenn Sie einen Status ändern und ihn dann direkt anzeigen, wird der vorherige Status angezeigt. Dies ist die fehleranfälligste Stelle in setState. Das Wort setState sieht nicht asynchron aus und kann daher Fehler verursachen, wenn Sie es unüberlegt verwenden. Das folgende Beispiel veranschaulicht dieses Problem gut:class Select extends React.Component { constructor(props, context) { super(props, context) this.state = { selection: props.values[0] }; } render() { return ( <ul onKeyDown={this.onKeyDown} tabIndex={0}> {this.props.values.map(value => <li className={value === this.state.selection ? 'selected' : ''} key={value} onClick={() => this.onSelect(value)} > {value} </li> )} </ul> ) } onSelect(value) { this.setState({ selection: value }) this.fireOnSelect() } onKeyDown = (e) => { const {values} = this.props const idx = values.indexOf(this.state.selection) if (e.keyCode === 38 && idx > 0) { /* up */ this.setState({ selection: values[idx - 1] }) } else if (e.keyCode === 40 && idx < values.length -1) { /* down */ this.setState({ selection: values[idx + 1] }) } this.fireOnSelect() } fireOnSelect() { if (typeof this.props.onSelect === "function") this.props.onSelect(this.state.selection) /* not what you expected..*/ } } ReactDOM.render( <Select values={["State.", "Should.", "Be.", "Synchronous."]} onSelect={value => console.log(value)} />, document.getElementById("app") )Auf den ersten Blick scheint an diesem Code nichts auszusetzen zu sein. Die Methode onSelect wird in beiden Event-Handlern aufgerufen. Es gibt jedoch einen Fehler in dieser Select-Komponente, der das vorherige GIF gut darstellt. Die onSelect-Methode übergibt immer den vorherigen state.selection-Wert, da setState beim Aufruf von fireOnSelect seine Arbeit noch nicht abgeschlossen hat. Ich denke, React sollte zumindest setState in ScheduleState ändern oder die Callback-Funktion zu einem erforderlichen Parameter machen. Dieser Fehler ist leicht zu beheben. Das Schwierigste ist, dass Sie wissen müssen, dass es dieses Problem gibt.
2. setState führt zu unnötigem Rendering
Das zweite durch setState verursachte Problem ist: Jeder Aufruf führt zu einem erneuten Rendering. Oft sind diese erneuten Renderings unnötig. Sie können printWasted in den React-Leistungstools verwenden, um zu sehen, wann unnötiges Rendering auftritt. Grob gesagt gibt es jedoch mehrere Gründe für unnötiges Rendern:- Der neue Zustand ist tatsächlich derselbe wie der vorherige. Dieses Problem kann normalerweise mit ShouldComponentUpdate gelöst werden. Sie können dieses Problem auch mit Pure Render oder anderen Bibliotheken lösen.
- Normalerweise hängt der geänderte Status mit dem Rendern zusammen, es gibt jedoch Ausnahmen. Beispielsweise werden einige Daten basierend auf bestimmten Zuständen angezeigt.
- Drittens haben einige Zustände nichts mit dem Rendern zu tun. Einige Zustände können mit Ereignissen und Timer-IDs zusammenhängen.
3.setState kann nicht alle Komponentenzustände effektiv verwalten
Basierend auf dem letzten Punkt oben sollten nicht alle Komponentenzustände mit SetState verwendet werden speichern und aktualisieren. Komplexe Komponenten können unterschiedliche Zustände aufweisen, die verwaltet werden müssen. Die Verwendung von setState zum Verwalten dieser Zustände führt nicht nur zu vielen unnötigen erneuten Renderings, sondern führt auch dazu, dass zugehörige Lebenszyklus-Hooks ständig aufgerufen werden, was zu vielen seltsamen Problemen führt.Nachwort
Im Originalartikel empfahl der Autor eine Bibliothek namens MobX, um einige Zustände zu verwalten, deshalb werde ich sie nicht vorstellen. Wenn Sie interessiert sind, können Sie die Einleitung im Originalartikel über den Link oben lesen. Basierend auf den drei oben genannten Punkten denke ich, dass Neulinge Folgendes beachten sollten: setState ist nicht garantiert synchronisiert. setState ist nicht garantiert synchronisiert , es ist nicht garantiert. Die Synchronisierung ist nicht garantiert. Sagen Sie wichtige Dinge dreimal. Der Grund, warum es nicht als asynchron bezeichnet wird, liegt darin, dass setState in einigen Fällen auch synchron aktualisiert wird. Sie können auf diesen Artikel verweisenWenn Sie den geänderten Wert direkt nach setState abrufen müssen, gibt es mehrere Möglichkeiten: Übergeben Sie die entsprechenden Parameter und erhalten Sie ihn nicht über this.state针对于之前的例子,完全可以在调用 fireOnSelect 的时候,传入需要的值。而不是在方法中在通过 this.state 来获取
使用回调函数
setState 方法接收一个 function 作为回调函数。这个回掉函数会在 setState 完成以后直接调用,这样就可以获取最新的 state 。对于之前的例子,就可以这样:
this.setState({ selection: value }, this.fireOnSelect)
使用setTimeout
在 setState 使用 setTimeout 来让 setState 先完成以后再执行里面内容。这样子:
this.setState({ selection: value }); setTimeout(this.fireOnSelect, 0);
直接输出,回调函数, setTimeout 对比
componentDidMount(){ this.setState({val: this.state.val + 1}, ()=>{ console.log("In callback " + this.state.val); }); console.log("Direct call " + this.state.val); setTimeout(()=>{ console.log("begin of setTimeout" + this.state.val); this.setState({val: this.state.val + 1}, ()=>{ console.log("setTimeout setState callback " + this.state.val); }); setTimeout(()=>{ console.log("setTimeout of settimeout " + this.state.val); }, 0); console.log("end of setTimeout " + this.state.val); }, 0); }
如果val默认为0, 输入的结果是:
Direct call 0
In callback 1
begin of setTimeout 1
setTimeout setState callback 2
end of setTimeout 2
setTimeout of settimeout 2
和渲染无关的状态尽量不要放在 state 中来管理
通常 state 中只来管理和渲染有关的状态 ,从而保证 setState 改变的状态都是和渲染有关的状态。这样子就可以避免不必要的重复渲染。其他和渲染无关的状态,可以直接以属性的形式保存在组件中,在需要的时候调用和改变,不会造成渲染。
避免不必要的修改,当 state 的值没有发生改变的时候,尽量不要使用 setState 。虽然 shouldComponentUpdate 和 PureComponent 可以避免不必要的重复渲染,但是还是增加了一层 shallowEqual 的调用,造成多余的浪费。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
Das obige ist der detaillierte Inhalt vonWas sollten Sie bei der Verwendung von React.setState beachten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Die Unterschiede in der Leistung und der Effizienz zwischen Python und JavaScript spiegeln sich hauptsächlich in: 1 wider: 1) Als interpretierter Sprache läuft Python langsam, weist jedoch eine hohe Entwicklungseffizienz auf und ist für eine schnelle Prototypentwicklung geeignet. 2) JavaScript ist auf einen einzelnen Thread im Browser beschränkt, aber Multi-Threading- und Asynchronen-E/A können verwendet werden, um die Leistung in Node.js zu verbessern, und beide haben Vorteile in tatsächlichen Projekten.

JavaScript stammt aus dem Jahr 1995 und wurde von Brandon Ike erstellt und realisierte die Sprache in C. 1.C-Sprache bietet Programmierfunktionen auf hoher Leistung und Systemebene für JavaScript. 2. Die Speicherverwaltung und die Leistungsoptimierung von JavaScript basieren auf C -Sprache. 3. Die plattformübergreifende Funktion der C-Sprache hilft JavaScript, auf verschiedenen Betriebssystemen effizient zu laufen.

JavaScript wird in Browsern und Node.js -Umgebungen ausgeführt und stützt sich auf die JavaScript -Engine, um Code zu analysieren und auszuführen. 1) abstrakter Syntaxbaum (AST) in der Parsenstufe erzeugen; 2) AST in die Kompilierungsphase in Bytecode oder Maschinencode umwandeln; 3) Führen Sie den kompilierten Code in der Ausführungsstufe aus.

Zu den zukünftigen Trends von Python und JavaScript gehören: 1. Python wird seine Position in den Bereichen wissenschaftlicher Computer und KI konsolidieren. JavaScript wird die Entwicklung der Web-Technologie fördern. Beide werden die Anwendungsszenarien in ihren jeweiligen Bereichen weiter erweitern und mehr Durchbrüche in der Leistung erzielen.

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.

Ja, der Motorkern von JavaScript ist in C. 1) Die C -Sprache bietet eine effiziente Leistung und die zugrunde liegende Steuerung, die für die Entwicklung der JavaScript -Engine geeignet ist. 2) Die V8-Engine als Beispiel wird sein Kern in C geschrieben, wobei die Effizienz und objektorientierte Eigenschaften von C kombiniert werden.

JavaScript ist das Herzstück moderner Websites, da es die Interaktivität und Dynamik von Webseiten verbessert. 1) Es ermöglicht die Änderung von Inhalten, ohne die Seite zu aktualisieren, 2) Webseiten durch DOMAPI zu manipulieren, 3) Komplexe interaktive Effekte wie Animation und Drag & Drop, 4) die Leistung und Best Practices optimieren, um die Benutzererfahrung zu verbessern.

C und JavaScript erreichen die Interoperabilität durch WebAssembly. 1) C -Code wird in das WebAssembly -Modul zusammengestellt und in die JavaScript -Umgebung eingeführt, um die Rechenleistung zu verbessern. 2) In der Spieleentwicklung kümmert sich C über Physik -Engines und Grafikwiedergabe, und JavaScript ist für die Spiellogik und die Benutzeroberfläche verantwortlich.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

EditPlus chinesische Crack-Version
Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Sicherer Prüfungsbrowser
Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

SAP NetWeaver Server-Adapter für Eclipse
Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.
