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 installieren Sie Nginx unter Win10

Da das Unternehmen mich bat, einen WebService-Ser...

So richten Sie eine automatische tägliche Datenbanksicherung in Linux ein

Dieser Artikel verwendet das Centos7.6-System und...

Detaillierte Erklärung zum MySQL-Index

Inhaltsverzeichnis 1. Index-Grundlagen 1.1 Einlei...

Detaillierte Erklärung zur Installation und Verwendung von Vue-Router

Inhaltsverzeichnis Installieren Grundlegende Konf...

Verstehen Sie kurz die MySQL-Datenbankoptimierungsphase

Einführung Haben Sie schon einmal eine Situation ...

Code zur Änderung des CSS-Bildlaufleistenstils

Code zur Änderung des CSS-Bildlaufleistenstils .s...

Wie können die Transaktionseigenschaften von MySQL InnoDB sichergestellt werden?

Vorwort Wenn Sie jemand fragt: „Was sind die Merk...

Farbabstimmungstechniken und Effektdarstellung für Beauty- und Styling-Websites

Farbe ist eines der wichtigsten Elemente jeder We...

TimePicker im Element deaktiviert einen Teil der Zeit (deaktiviert auf Minuten)

Die Projektanforderungen lauten: Datum und Uhrzei...