Heim >Web-Frontend >js-Tutorial >Sind Funktionskomponenten gleichbedeutend mit funktionaler Programmierung?
React-Entwickler sind bereits mit der Tatsache vertraut, dass React zwei Komponententypen hat:
Wenn man die Erwähnung von „Klasse“ und „Funktion“ betrachtet, stellen sich natürlich Fragen:
Wenn Klassenkomponenten mit OOP verknüpft sind, können die OOP-Prinzipien (Vererbung, Kapselung, Polymorphismus usw.) die Entwicklung klassenbasierter Komponenten leiten. Ebenso können FP-Prinzipien funktionale Komponenten beeinflussen. Mit anderen Worten: Wir können die Best Practices dieser Programmierparadigmen direkt auf React-Projekte anwenden.
Welche Beziehung besteht also zwischen funktionalen Komponenten und funktionaler Programmierung? Dieser Artikel befasst sich mit diesem Thema.
Zunächst sollten wir klarstellen, dass es sich bei der Framework-Syntax im Wesentlichen um eine DSL (Domain Specific Language) handelt, die für die Entwicklung in einer bestimmten Domäne angepasst ist.
React ist beispielsweise eine DSL zum Erstellen von Ansichten. Obwohl verschiedene Plattformen unterschiedliche Frameworks zum Erstellen von Ansichten verwenden, zum Beispiel:
Diese Frameworks folgen normalerweise der gleichen DSL (React-Syntax). Dieses DSL ist nicht an ein bestimmtes Programmierparadigma gebunden, sondern sollte als eine Reihe von Sprachfunktionen betrachtet werden, die sich gut für die View-Entwicklung eignen.
Also, als Teil des React DSL:
Solange diese Prinzipien für die Entwicklung von Vorteil sind, können sie in das DSL integriert werden.
Betrachten Sie beispielsweise den folgenden Funktionskomponenten-Header, der aus WelcomeMessage und LogoutButton besteht und das Prinzip der Zusammensetzung über die Vererbung in OOP demonstriert:
<code class="language-javascript">function Header(props) { return ( <div> <WelcomeMessage name={props.name} /> <LogoutButton onClick={props.onLogout} /> </div> ); }</code>
Betrachten Sie in ähnlicher Weise die Klassenkomponente Cpn, bei der die Statusanzahl nicht durch Mutation (this.state.count), sondern durch Aufruf von this.setState mit unveränderlichen Daten aktualisiert wird:
<code class="language-javascript">class Cpn extends React.Component { // ... onClick() { const count = this.state.count; this.setState({ count: count + 1 }); } render() { // ... } }</code>
Die Verwendung unveränderlicher Daten spiegelt die Prinzipien von FP wider.
Daher sollten wir bei der Erkundung einer React-Funktion die folgenden drei Schritte berücksichtigen:
Indem wir diesen Denkprozess auf die Beziehung zwischen funktionalen Komponenten und funktionaler Programmierung anwenden, finden wir:
Dies definiert die Beziehung zwischen ihnen: Funktionskomponenten sind das Produkt der Implementierung mehrerer Programmierparadigmen (hauptsächlich OOP und FP) in React, wobei einige Ideen von FP übernommen wurden.
Funktionale Komponenten sollten nicht nur als Verkörperung der funktionalen Programmierung in React betrachtet werden.
Lassen Sie uns die Entwicklung funktionaler Komponenten anhand des zuvor erwähnten dreistufigen Denkprozesses untersuchen. Die Entwicklungsphilosophie von React lässt sich am besten durch die folgende Formel ausdrücken:
<code class="language-javascript">function Header(props) { return ( <div> <WelcomeMessage name={props.name} /> <LogoutButton onClick={props.onLogout} /> </div> ); }</code>
Um dieses Konzept zu verwirklichen, sind zwei Schlüsselelemente erforderlich:
Hier eignen sich die unveränderlichen Daten von FP besser als Träger des Daten-Snapshots. Aus diesem Grund ist der Zustand in React unveränderlich – das Wesen des Zustands ist eine Momentaufnahme.
Es gibt keine besonderen Anforderungen an den Träger der Funktionszuordnung. In React löst jedes Update ein erneutes Rendern aus, und der Renderprozess selbst ist ein Funktionszuordnungsprozess. Die Eingabe ist Requisiten und Zustand und die Ausgabe ist JSX.
Im Gegensatz dazu entsprechen Vue-Komponenten eher den OOP-Prinzipien. Betrachten Sie diese Vue-App-Komponente:
<code class="language-javascript">class Cpn extends React.Component { // ... onClick() { const count = this.state.count; this.setState({ count: count + 1 }); } render() { // ... } }</code>
Die Setup-Methode der Komponente wird nur einmal während der Initialisierung ausgeführt. Nachfolgende Aktualisierungsvorgänge arbeiten mit denselben Daten innerhalb des Abschlusses, was dem Konzept der Instanzen in OOP entspricht.
Da React keine besonderen Anforderungen an den Träger der Funktionszuordnung stellt, sind sowohl Klassenkomponenten als auch Funktionskomponenten praktikable Optionen.
Viele Menschen glauben, dass die Verbesserung der Wiederverwendbarkeit von Logik durch Hooks der Hauptgrund dafür ist, dass Funktionskomponenten Klassenkomponenten überlegen sind. Allerdings hat sich das auf Dekoratoren basierende Klassenentwicklungsmodell, insbesondere in Kombination mit TypeScript, als effektive Methode zur Wiederverwendung von Logik erwiesen.
Der wahre Grund ist, dass Funktionskomponenten das Konzept von UI = fn(snapshot) besser implementieren können.
Wie bereits erwähnt, stellt der Schnappschuss in der Formel einen Schnappschuss des Zustands dar, der in React Folgendes umfasst:
Für eine bestimmte Komponente stellt die Formel UI = fn(snapshot) sicher, dass derselbe Snapshot die gleiche Ausgabe (JSX) erzeugt. Statusaktualisierungen können jedoch auch Nebenwirkungen auslösen, wie z. B. das Abrufen von Daten oder DOM-Manipulationen.
In Klassenkomponenten sind diese Nebeneffektlogiken auf verschiedene Lebenszyklusmethoden verteilt, was die Steuerung von React erschwert. Aber in der Funktionskomponente:
<code>UI = fn(snapshot);</code>
Verwendung:
<code class="language-javascript">const App = { setup(initialProps) { const count = reactive({ count: 0 }); const add = () => { count.value++; }; return { count, add }; }, template: "...omitted" };</code>
Kurz gesagt sorgen funktionale Komponenten dafür, dass Nebenwirkungen kontrollierbar bleiben und eine konsistente Ausgabe für die gleiche Snapshot-Eingabe bereitgestellt wird. Dies steht im Einklang mit dem Konzept reiner Funktionen in FP, weshalb funktionale Komponenten in React zu einer gängigen Wahl geworden sind.
Funktionskomponenten sind keine direkte Implementierung der funktionalen Programmierung in React, sondern der am besten geeignete Träger zur Implementierung des Kernkonzepts von React UI = fn(snapshot). React integriert hervorragende Ideen aus verschiedenen Programmierparadigmen, von denen FP den größten Einfluss hat. Letztlich dient jede Designentscheidung der Gesamtidee.
Leapcell ist eine serverlose Plattform der neuen Generation für Webhosting, asynchrone Aufgaben und Redis:
Mehrsprachige Unterstützung
Unbegrenzt viele Projekte kostenlos bereitstellen
Unvergleichliche Kosteneffizienz
Vereinfachte Entwicklererfahrung
Einfache Skalierbarkeit und hohe Leistung
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ
Lesen Sie unseren Blog
Das obige ist der detaillierte Inhalt vonSind Funktionskomponenten gleichbedeutend mit funktionaler Programmierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!