Schritte zur Erstellung einer React Fiber-Struktur

Schritte zur Erstellung einer React Fiber-Struktur

React-Fasererstellung

Die aktuelle React-Version basiert auf V17.0.2. Dieser Artikel stellt hauptsächlich die Erstellung der Faserstruktur vor.

1. Bevor Sie beginnen

Dies ist mein persönliches Verständnis. Wenn etwas falsch ist, weisen Sie mich bitte darauf hin.

Zuerst müssen Sie die React-Debugger-Entwicklungsumgebung konfigurieren. Der Eintrag ist hier: github

Führen Sie „npm run i“ aus, um Abhängigkeiten zu installieren, und „npm start“, um die Umgebung auszuführen.

2. Beginnen Sie mit React.render

Aktivieren Sie Debug und zeigen Sie den React-Aufrufstapel an, indem Sie React.render beim Projekteinstieg aufrufen.

const root = document.getElementById('root');
ReactDOM.render(
  <Reagieren.StrictMode>
    <App />
  </React.StrictMode>,
  Wurzel
);

Nachdem React „render“ aufgerufen hat, ruft es „legacyRenderSubtreeIntoContainer“ auf, nachdem die Basiskonfiguration übergeben wurde.

Exportfunktion rendern(
  Element: React$Element<beliebig>,
  Container: Container,
  Rückruf: ?Funktion,
) {
  // Etwas Umgebungscode entfernen // ...
  returniere legacyRenderSubtreeIntoContainer(
    null,
    Element,
    Container,
    FALSCH,
    Rückruf,
  );
}

Nachdem React „render“ aufgerufen hat, ruft es „legacyRenderSubtreeIntoContainer“ auf, nachdem die Basiskonfiguration übergeben wurde.

Exportfunktion rendern(
  Element: React$Element<beliebig>,
  Container: Container,
  Rückruf: ?Funktion,
) {
  // Etwas Umgebungscode entfernen // ...
  returniere legacyRenderSubtreeIntoContainer(
    null,
    Element,
    Container,
    FALSCH,
    Rückruf,
  );
}

legacyRenderSubtreeIntoContainer macht insgesamt zwei Dinge: Das eine ist das Generieren von fiberRoot, das andere ist das Aufrufen von updateContainer.

Geben Sie die Funktion legacyCreateRootFromDOMContainer ein, um zu sehen, wie fiberRoot generiert wird. Innerhalb der Funktion wird createLegacyRoot aufgerufen und hier unterscheiden wir, ob Hydrate verwendet werden soll, wie folgt:

  returniere createLegacyRoot(
    Container,
    sollteHydrieren
      ? {
        Hydrat: wahr,
      }
      : undefiniert,
  );

Für createLegacyRoot wird es zum Instanziieren der Funktion ReactDOMLegacyRoot verwendet. Durch nachfolgende Aufrufe gelangt es schließlich zur Root-Generierung, ruft die Funktion createRootImpl auf und instanziiert den Root.

Geben Sie die Funktion createFiberRoot ein und initialisieren Sie FiberRootNode.

Funktion FiberRootNode(ContainerInfo, Tag, Hydrat) {
  this.tag = Tag; // Typ this.containerInfo = ContainerInfo; // Container
  dies.pendingChildren = null; 
  dies.aktuell = null;
  this.pingCache = null;
  dies.fertigeArbeit = null;
  this.timeoutHandle = keinTimeout;
  dieser.Kontext = null;
  this.pendingContext = null;
  dies.hydrate = Hydrat;
  this.callbackNode = null;
  this.callbackPriority = KeineLanePriority;
  this.eventTimes = createLaneMap(KeineFahrspuren);
  this.expirationTimes = createLaneMap(Kein Zeitstempel);

  this.pendingLanes = KeineLanes;
  this.suspendedLanes = KeineLanes;
  this.pingedLanes = KeineLanes;
  this.mutableReadLanes = KeineLanes;
  this.finishedLanes = KeineLanes;

  this.entangledLanes = KeineLanes;
  dies.entanglements = createLaneMap(KeineLanes);

  // ....


}

Es gibt hier mehrere Arten von Tags.

Exporttyp RootTag = 0 | 1;

Die obige Struktur ist der FiberRootNode-Knoten.

Wenn rootTag gleich 0 ist, stellt es den Legacy-Rendering-Modus dar, und wenn es gleich 1 ist, stellt es das Rendering im Concurrent-Modus dar. Das heißt, traditionell verwenden wir React.render zum Rendering, und wenn React.createRoot aufgerufen wird, wechselt es in den Rendering-Modus im Concurrent-Modus, also paralleles Rendering.

Schauen wir uns nun die Struktur der Faser an.

  const uninitializedFiber = createHostRootFiber(tag, strictModeLevelOverride);
  root.current = nicht initialisierte Faser;
  uninitializedFiber.stateNode = root;

uninitializedFiber ist die Instanz des erstellten FiberNode.

const createFiber = Funktion(
  Tag: WorkTag,
  pendingProps: gemischt,
  Schlüssel: null | Zeichenfolge,
  Modus: TypeOfMode,
): Faser {
  // $FlowFixMe: die Formen sind hier exakt, aber Flow mag keine Konstruktoren
  gibt neuen FiberNode (Tag, pendingProps, Schlüssel, Modus) zurück;
};

Durch die grundlegende Erstellung wird die FiberNode-Struktur wie folgt generiert

Funktion FiberNode(
  Tag: WorkTag,
  pendingProps: gemischt,
  Schlüssel: null | Zeichenfolge,
  Modus: TypeOfMode,
) {
  // Instanz
  this.tag = tag; //Komponententyp this.key = key; //Schlüsselattribut this.elementType = null; //Elementtyp, Klassenfunktion, Anzeigeklasse, div-Anzeige div
  this.type = null; //Funktion oder Klasse
  this.stateNode = null; //Dom-Knoten // Fiber
  this.return = null; //Zeigt auf den übergeordneten Knoten this.child = null; //Zeigt auf den untergeordneten Knoten this.sibling = null; //Geschwisterknoten this.index = 0; //

  dies.ref = null;

  this.pendingProps = pendingProps; // Warte auf Eigenschaften pendingProps
  this.memoizedProps = null; //Speichereigenschaften, normalerweise werden Props gespeichert
  this.updateQueue = null; //Warteschlange aktualisieren this.memoizedState = null; //Status allgemein speichern
  diese.Abhängigkeiten = null;

  dieser.Modus = Modus;

  // Zugehörige Effekte this.flags = NoFlags;
  this.subtreeFlags = KeineFlags;
  diese.deletions = null;

  this.lanes = KeineLanes;
  this.childLanes = KeineLanes;

  this.alternate = null; //zeigt auf workInProgress
}

Die grundlegende Darstellung von FiberNode ist wie oben. Die grundlegenden Typen von Elementtyp und Typ sind Funktion und Klasse.

Durch Vergleichen der FiberRootNode-Struktur mit dem folgenden Code wird die endgültige FiberNode-Struktur generiert.

rendern() {
    const { Name, Anzahl } = dieser.Zustand;
    zurückkehren (
      <div Klassenname="App">
          <Schaltflächenname={name} />
        {
          zählen
        }
      </div>
    );
  }
ReactDOM.render(
  <Reagieren.StrictMode>
    <App />
  </React.StrictMode>,
  Wurzel
);

Durch die abschließende Ausführung wird die FiberRoot-Verknüpfungslistenstruktur generiert.

Abschließend wird zum Rendern unbatchedUpdates aufgerufen.

Geben Sie die Funktion updateContainer ein.

unbatchedUpdates(() => {
  // Container aktualisieren
  UpdateContainer (untergeordnete Elemente, FiberRoot, übergeordnete Komponente, Rückruf);
});

3. Ende

Oben sind die Einzelheiten der Schritte zum Erstellen der React Fiber-Struktur aufgeführt. Weitere Informationen zum Erstellen der React Fiber-Struktur finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Eine detaillierte Erklärung, wie React Fiber funktioniert

<<:  So gehen Sie mit der Meldung „Vorgang nicht zulässig“ beim Löschen von Dateien in Linux um

>>:  Detaillierte Erläuterung der Implementierungsmethode für die Datenbank-Mehrtabellenverbindungsabfrage

Artikel empfehlen

So deinstallieren Sie Docker Toolbox vollständig

Docker Toolbox ist eine Lösung zur Installation v...

Detaillierte Analyse von MySQL-Deadlock-Problemen

Vorwort Wenn sich unser Geschäft in einem sehr fr...

JavaScript-Puzzlespiel

In diesem Artikelbeispiel wird der spezifische Ja...

js Promise-Methode zur gleichzeitigen Steuerung

Inhaltsverzeichnis Frage Hintergrund Idee & U...

MySQL Installations-Tutorial unter Windows mit Bildern und Text

Anweisungen zur MySQL-Installation MySQL ist ein ...

Datenbankabfrage, welches Objekt welches Feld enthält, Methodenanweisung

Die Datenbank fragt ab, welches Objekt welche Fel...

MySQL-Löschfunktion für Mehrfachtabellenverbindungen

Löschen einer einzelnen Tabelle: LÖSCHEN AUS Tabe...

Kopieren und Einfügen ist der Feind der Verpackung

Bevor wir über OO, Entwurfsmuster und die vielen o...

Grafisches Tutorial zur Installation von mysql5.7.17.msi

mysql-5.7.17.msi Installation, folgen Sie den Scr...