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

MariaDB-Serverinstallation der MySQL-Reihe

Inhaltsverzeichnis Tutorial-Reihe 1. Installieren...

CSS HACK für IE6/IE7/IE8/IE9/FF (Zusammenfassung)

Seit ich die offizielle Version von IE8.0 install...

CSS realisiert Div vollständig zentriert, ohne Höhe festzulegen

Erfordern Das Div unter dem Körper ist vertikal z...

Tipps zur MySQL-Leistungsoptimierung

MySQL-Leistungsoptimierung MySQL wird in Internet...

WeChat-Miniprogramm zur Implementierung elektronischer Signaturen

In diesem Artikel finden Sie den spezifischen Cod...

Analyse des SELECT-Abfrageausdrucks in der MySQL-Datenbank

Ein großer Teil der Datenverwaltung besteht aus S...

Detaillierte Erklärung der Verwendung von SetUp- und Reactive-Funktionen in Vue3

1. Wann soll setUp ausgeführt werden? Wir alle wi...

Einführung in die Parameter und Regeln für reguläre Ausdrücke bei Nginx

Vorwort In letzter Zeit habe ich Kunden dabei geh...

JavaScript zum Erzielen eines Klickbild-Flip-Effekts

Ich habe kürzlich an einem Projekt zur Gesichtser...

Vue3 Vue-Ereignisbehandlungshandbuch

Inhaltsverzeichnis 1. Grundlegende Ereignisbehand...