Введение
В этой статье будет использоваться простой пример в сочетании с исходным кодом React (v 16.4.2), чтобы проиллюстрировать, как работает React, и помочь читателям понять взаимосвязь между ReactElement и Fiber, а также роль Fiber в каждом процессе. Прочитав эту статью, вы сможете легче понять исходный код React. Первоначальный план включает в себя следующие статьи:
- первый рендер
- механизм события
- процесс обновления
- механизм планирования
Во-вторых, анализ основного типа
Прежде чем перейти к объяснению процесса, давайте сначала разберемся с основными типами в исходном коде React, что поможет нам лучше понять весь процесс. Чтобы облегчить понимание для всех, последующее описание извлекает только основную часть и упрощает ссылку, контекст, асинхронность, планирование, обработку исключений и тому подобное.
1. ReactElement
Когда мы пишем компоненты React, мы обычно используемJSX
для описания компонентов.<p></p>
После того, как эта запись будет преобразована Babel, она станет иметь вид React.createElement(type, props, children). И в нашем примере,type
Будет два вида:function
,string
.function
обычно означаетReactComponent
изconstructor
или функциональные компонентыfunction
,а такжеstring
типHTML
Этикетка.
Этот метод в конечном итоге вернет ReactElement , который является обычным Object , не созданным через класс, просто взгляните на него.Основные члены следующие:
key | type | desc |
---|---|---|
?typeof | Symbol|Number | Идентификатор типа объекта, используемый для определения того, является ли текущий объект определенным типом ReactElement. |
type | Function|String|Symbol|Number|Object | Если текущий ReactElement является ReactComponent, то это будет его соответствующий Constructor, в то время как обычные теги HTML обычно представляют собой String. |
props | Object | Все свойства в ReactElement, включая специальные дочерние свойства |
2. ReactRoot
в настоящее время находится внутри ReactDom.js, который можно понимать как точку входа в рендеринг React. мы называемReactDom.render
После этого ядром является создание ReactRoot, а затем вызов экземпляра ReactRoot дляrender
метод, который входит в процесс рендеринга.
key | type | desc |
---|---|---|
render | Function | метод входа в рендеринг |
_internalRoot | FiberRoot | Корень FiberTree, созданный из текущего DOMContainer. |
3. FiberRoot
FiberRoot — это объект, который является основным корневым объектом для последующей инициализации и обновления. Основные члены следующие:
key | type | desc |
---|---|---|
current | (HostRoot)FiberNode | Указывает на корень текущего завершенного дерева волокон. |
containerInfo | DOMContainer | DOM-контейнер React, который отображает весь React в этот DOM. |
finishedWork | (HostRoot)FiberNode|null | Указывает на корень дерева волокон, подготовка к которому завершена. |
current и finishWork являются узлами FiberNode (HostRoot) Почему? Сначала продай, а потом объясню.
4. FiberNode
После React 16 Fiber Reconciler используется в качестве планировщика React по умолчанию, а основной структурой данных является дерево узлов, состоящее из FiberNode. Сначала посетите его основных членов:
key | type | desc |
---|---|---|
связанный с экземпляром | --- | --- |
tag | Number | Тип FiberNode, который можно найти в packages/shared/ReactTypeOfWork.js. В текущей демонстрации статьи вы можете увидеть ClassComponent, HostRoot, HostComponent и HostText. |
type | Function|String|Symbol|Number|Object | В соответствии с ReactElement |
stateNode | FiberRoot|DomElement|ReactComponentInstance | FiberNode будет связывать некоторые другие объекты через stateNode, такие как экземпляры Dom, FiberRoot, ReactComponent, соответствующие FiberNode. |
Процесс прохождения волокна, связанный с | ||
return | FiberNode|null | Представляет родительский узел FiberNode |
child | FiberNode|null | Представляет первый дочерний узел FiberNode. |
sibling | FiberNode|null | Указывает ближайший соседний узел FiberNode того же уровня. |
alternate | FiberNode|null | Алгоритм планирования Fiber использует алгоритм двойного буферного пула.Все узлы под FiberRoot будут пытаться создать свои собственные «зеркала» во время процесса алгоритма, который будет объяснен позже. |
связанные с данными | ||
pendingProps | Object | Указывает новый реквизит |
memoizedProps | Object | Представляет новые реквизиты после обработки всех процессов. |
memoizedState | Object | Представляет новое состояние после обработки всех процессов |
Описание побочных эффектов | ||
updateQueue | UpdateQueue | Обновите очередь. В очереди содержится статус предстоящего изменения. Подробности будут объяснены позже. |
effectTag | Number | Шестнадцатеричные числа можно понимать как идентификацию n действий через поле, таких как размещение, обновление, удаление, обратный вызов... Поэтому я вижу много &= в исходном коде. |
firstEffect | FiberNode|null | Относится к процессу обхода операции побочного эффекта. Ссылка на первый узел FiberNode побочного эффекта, который необходимо обработать в текущем узле. |
nextEffect | FiberNode|null | Ссылка на FiberNode, представляющий следующий обрабатываемый побочный эффект. |
lastEffect | FiberNode|null | Ссылка на последний побочный эффект FiberNode, который будет обработан. |
5. Update
Во время выполнения алгоритма планирования действие, которое необходимо изменить, будет представлено данными обновления. Обновления в той же очереди будут объединены через следующий атрибут, который на самом деле является односвязным списком.
key | type | desc |
---|---|---|
tag | Number | В настоящее время их 0~3, а именно UpdateState, ReplaceState, ForceUpdate, CaptureUpdate |
payload | Function|Object | Указывает содержимое данных, соответствующее этому обновлению. |
callback | Function | Указывает на обновленную функцию обратного вызова. Если этот обратный вызов имеет значение, он будет привязан к текущему объекту Update в списке побочных эффектов UpdateQueue. |
next | Update | Обновления в UpdateQueue последовательно соединены следующим, что указывает на следующий объект Update. |
6. UpdateQueue
Представляет набор побочных эффектов (в основном, обратный вызов) текущего обновления узла в узле FiberNode. В следующей структуре часть CapturedUpdate опущена.
key | type | desc |
---|---|---|
baseState | Object | Указывает базовое состояние перед обновлением |
firstUpdate | Update | Первая ссылка на объект обновления, в целом представляет собой односвязный список |
lastUpdate | Update | последняя ссылка на объект обновления |
firstEffect | Update | Ссылка на первый объект Update, содержащий побочный эффект (обратный вызов). |
lastEffect | Update | Ссылка на последний объект Update, содержащий побочный эффект (обратный вызов). |
3. Примеры кода
Это описание процесса, используйте следующий исходный код для анализа
//index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
//App.js
import React, { Component } from 'react';
import './App.css';
class App extends Component {
constructor() {
super();
this.state = {
msg:'init',
};
}
render() {
return (
<div className="App">
<p className="App-intro">
To get started, edit <code>{this.state.msg}</code> and save to reload.
</p>
<button onClick={() => {
this.setState({msg: 'clicked'});
}}>hehe
</button>
</div>
);
}
}
export default App;
4. Алгоритм планирования рендеринга — этап подготовки
отReactDom.render
Метод запускается и официально входит в стадию подготовки к рендерингу.
1. Инициализируйте базовый узел
Создайте ReactRoot, FiberRoot, (HostRoot)FiberNode и установите их связь с DOMContainer.
2. Инициализировать(HostRoot)FiberNode
изUpdateQueue
по телефонуReactRoot.render
, затем введитеpackages/react-reconciler/src/ReactFiberReconciler.js
изupdateContainer -> updateContainerAtExpirationTime -> scheduleRootUpdate
Серия вызовов методов, создающих Update для этой инициализации, помещающих<App />
Этот ReactElement как элемент обновленияpayload.element
Значение , а затем поместите обновление в updateQueue (HostRoot)FiberNode.
тогда позвониscheduleWork -> performSyncWork -> performWork -> performWorkOnRoot
, период в основном предназначен для извлечения (HostFiber) FiberNode, который должен быть инициализирован в настоящее время, а затем официально перейти к этапу выполнения алгоритма.
5. Алгоритм планирования рендеринга — этап выполнения
Поскольку это время инициализации, его нужно вызватьpackages/react-reconciler/src/ReactFiberScheduler.js
изrenderRoot
метод для создания полного дерева FiberNodefinishedWork
.
1. Создайте (HostRoot) FiberNodeworkInProgress
,Прямо сейчасcurrent.alternate
.
Во всем алгоритмическом процессе главное — пройти узлы FiberNode. В алгоритме есть две роли: одна — представлять исходную форму текущего узла.current
узел, другой - пересчитать на основе текущего узлаworkInProgress/alternate
узел. Два экземпляра объекта независимы и проходят друг перед другомalternate
Свойства ссылаются друг на друга. Многие свойства объектов先复制再重建
из.
Создайте диаграмму результатов в первый раз:
Основная идея этого подхода заключается в双缓池技术(double buffering pooling technique)
, потому что, если вам нужно сделать diff, у вас должно быть как минимум два дерева для сравнения. Таким образом, общее количество деревьев может быть ограничено до2
, узлы и атрибуты узлов создаются лениво, чтобы свести к минимуму рост использования памяти из-за процесса алгоритма. В следующей статье о процессе обновления вы узнаете об этом双缓冲
Как играть.
2. Цикл выполнения работы
Схематический код выглядит следующим образом:
nextUnitOfWork = createWorkInProgress(
nextRoot.current,
null,
nextRenderExpirationTime,
);
....
while (nextUnitOfWork !== null) {
nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
}
Только что созданный FiberNode используется какnextUnitOfWork
, а затем войти в рабочий цикл. Как видно из приведенного выше кода, это типичный метод записи рекурсивного цикла. Запись цикла таким способом аналогична традиционному рекурсивному способу записи цикла, избегая непрерывного наложения стека вызовов и переполнения стека вызовов.Scheduler
Вспомогательная переменная кода может реализовать эффект прекращения обхода в любой момент и возобновления в любой момент.
мы идем дальшеperformUnitOfWork
можно увидеть аналогичный кадр кода:
const current = workInProgress.alternate;
//...
next = beginWork(current, workInProgress, nextRenderExpirationTime);
//...
if (next === null) {
next = completeUnitOfWork(workInProgress);
}
//...
return next;
Отсюда видно, что на узле workInProgress выполняется какая-то обработка, а затем она будет пропущена через一定的遍历规则
вернутьnext
,еслиnext
Если он не пустой, вернуться к следующемуperformUnitOfWork
, иначе введитеcompleteUnitOfWork
.
3. beginWork
Цель каждой работы в основном состоит в том, чтобы иметь дело сworkInProgress
. здесь черезworkInProgress.tag
Определите тип текущего узла FiberNode, а затем выполните соответствующую обработку обновления. Далее описываются два типа обработки FiberNode, которые являются более сложными в нашем примере, а затем объясняются более важные из них отдельно.processUpdateQueue
так же какreconcileChildren
Обработать.
3.1 HostRoot - updateHostRoot
HostRoot, то есть (HostRoot)FiberNode, часто упоминаемый в тексте, указывает, что это FiberNode типа HostRoot, который передается в кодеFiberRoot.tag
Выражать.
Как упоминалось ранее, во время начальной инициализации (HostRoot) FiberNode инициализировал свойupdateQueue
, который содержит дочерние узлы для обработки. Вот два действия:
- Обработать очередь обновлений и получить новое состояние — метод processUpdateQueue
- Создайте или обновите FiberNode
child
, получить входной параметр следующего рабочего цикла (тоже FiberNode) — метод ChildReconciler
Детали этих двух функций относятся к более общей части, которая будет объяснена отдельно позже.
3.2 ClassComponent - updateClassComponent
ClassComponent, то есть Компонент, который мы написали, когда писали код React, который является примером в примереApp
.
3.2.1 СоздатьReactComponent
стадия экземпляра
Для узлов, которые не были инициализированы, этот метод в основном черезFiberNode.type
Конструктор ReactComponent для создания экземпляров ReactComponent и создания отношений с FiberNode s.
(ClassComponent) Схематическая диаграмма взаимосвязи между FiberNode и ReactComponent:
После инициализации он войдет вmount
процесса, то есть поставить Компонентrender
Был вызван метод предыдущего цикла. период,state
Может быть изменен следующими процессами:
- вызов getDerivedStateFromProps
- вызов componentWillMount --устарело
- Обработайте processUpdateQueue, вызванный обновлением, созданным вышеуказанным процессом.
3.2.2 Этап завершения — создание дочернего узла FiberNode
После инициализации экземпляра компонента, описанного выше, путем вызова экземпляраrender
Получите дочерний элемент ReactElement и создайте все соответствующие дочерние узлы FiberNode. в конце концовworkInProgress.child
Указывает на первый дочерний узел FiberNode.
3.4 Обработка очереди обновления узла — метод processUpdateQueue
Прежде чем объяснять процесс, давайте рассмотрим структуру данных updateQueue:
Как видно из приведенной выше структуры, UpdateQueue — это контейнер, в котором хранится весь односвязный список обновлений. BaseState внутри представляет собой исходное состояние перед обновлением, и после прохождения каждого связанного списка Update в конечном итоге будет получено новое baseState.
Для обработки одного обновления оно в основном основано наUpdate.tag
различать.
- ReplaceState: верните сюда полезные данные напрямую. Если полезная нагрузка является функцией, используйте ее возвращаемое значение в качестве нового состояния.
- CaptureUpdate: просто
workInProgress.effectTag
установить, чтобы очиститьShouldCapture
пометить бит, увеличитьDidCapture
бит флага. - UpdateState: если полезная нагрузка является обычным объектом, обрабатывайте ее как новое состояние. Если полезная нагрузка является функцией, возвращаемое значение, полученное при выполнении функции, используется в качестве нового состояния. Если новое состояние не пусто, сливается с исходным состоянием и возвращает
新对象
. - ForceUpdate: просто установка
hasForceUpdate
Если true, возвращает исходное состояние.
В целом, этот метод должен пройти через эту очередь UpdateQueue, а затем вычислить окончательное новое состояние, а затем сохранить его вworkInProgress.memoizedState
середина.
3.5 Обработка дочернего узла FiberNode — метод reconcileChildren
После обработки самого узла workInProgress он пройдетprops.children
илиinstance.render方法
Получите дочерний элемент ReactElement. Дочерний элемент ReactElement может быть对象
,数组
,字符串
,迭代器
, для различных видов обработки.
- Ниже через ClassComponent и его
数组类型 child
сцена для объяснения процесса создания и ассоциации дочернего узла FiberNode (reconcileChildrenArray方法
):
На этапе инициализации страницы, поскольку нет старого узла, процесс пропускает логику сравнения индекса позиции и очистки родственных элементов, поэтому этот процесс относительно прост.
перед обходомrender
Массив ReactElement, сгенерированный методом, генерирует FiberNode во взаимно однозначном соответствии. FiberNode имеетreturnFiber
свойства иsibling
свойства, указывающие на его родительский узел FiberNode и ближайший соседний узел FiberNode соответственно. Эта структура данных связана с последующим процессом обхода.
Теперь созданная структура дерева Fibernode выглядит следующим образом:
Двое на картинке(HostComponent)FiberNode
Это только что сгенерированный дочерний узел FiberNode, то есть в исходном коде.<p>...</p>
а также<button>...</button>
. Последнее, что возвращает этот метод, — это первый дочерний узел FiberNode, созданный таким образом.(ClassComponent)FiberNode.child
Отношение к первому дочернему узлу FiberNode.
В это время уберите код, который вы только что видели:
const current = workInProgress.alternate;
//...
next = beginWork(current, workInProgress, nextRenderExpirationTime);
//...
if (next === null) {
next = completeUnitOfWork(workInProgress);
}
//...
return next;
означает, что только что вернувшийся ребенок будет считатьсяnext
Введите следующий рабочий цикл. Таким образом, вы получите следующее дерево FiberNode:
После создания этого дерева возвращается (HostText)FiberNode в левом нижнем углу. и повторно введитеbeginWork
После метода, поскольку этот FiberNode не имеет дочернего элемента, в соответствии с приведенной выше логикой кода, он войдетcompleteUnitOfWork
метод.
Примечание. Хотя окончательная форма дерева узлов волокна в этом примере выглядит так, на самом деле алгоритм заключается в том, чтобы сначала пройти глубину, а затем пройти соседние одноуровневые узлы после достижения конечного узла. Если у родственного узла есть дочерние элементы, он будет продолжать расширяться.
4. completeUnitOfWork
Войдите в этот процесс, указав, что узел workInProgress является конечным узлом или его дочерние узлы были обработаны. Теперь, чтобы сделать остальную работу, сделанную этим узлом.
4.1 Создайте DomElement и обработайте отношения привязки дочернего DomElement
completeWork
метод, согласноworkInProgress.tag
Чтобы различать разные действия, для дальнейшего анализа выбираются следующие два более важных:
4.1.1 HostText
упомянутый ранее,FiberNode.stateNode
Может использоваться для хранения экземпляров DomElement. Во время инициализации stateNode имеет значение null, поэтому он пройдетdocument.createTextNode
Создайте Text DomElement, содержимое узлаworkInProgress.memoizedProps
. Наконец, по__reactInternalInstance$[randomKey]
устанавливает соединение со своим собственным FiberNode.
4.1.2 HostComponent
В этом примере, после обработки вышеприведенного HostText, алгоритм планирования будет искать одноуровневый узел текущего узла для обработки, поэтому введитеHostComponent
поток обработки.
Из-за текущего процесса инициализации обработка относительно проста, как раз в соответствии сFiberNode.tag
(текущее значениеcode
) для создания DomElement, т.е.document.createElement
Для создания узла. затем пройти__reactInternalInstance$[randomKey]
атрибут устанавливает соединение со своим собственным FiberNode; через__reactEventHandlers$[randomKey]
установить связь с реквизитом.
После завершения создания самого DomElement, если есть дочерние узлы, дочерние узлы будут добавлены к текущему узлу. Пропустите этот шаг на данный момент.
сопровождение, черезsetInitialProperties
метод инициализирует свойства DomElement и<code>
Содержание узла, стиль,class
, обработчик событий и т. д. также сохраняются в это время.
Теперь все дерево FiberNode выглядит следующим образом:
После нескольких циклов получается следующее дерево FiberNode:
После вернитесь к узлу FiberNode (HostComponent), указанному красной стрелкой, и проанализируйте поток обработки дочернего узла, который был пропущен ранее.
После создания текущего DomElement введитеappendAllChildren
Метод добавляет дочерний узел к текущему элементу DomElement. Из вышеописанного процесса можно узнать, чтоworkInProgress.child -> workInProgress.child.sibling -> workInProgress.child.sibling.sibling ....
Найдите все дочерние узлы, и stateNode каждого узла является соответствующим DomElement, поэтому, проходя таким образом, все DomElements могут быть подключены к родительскому DomElement.
Наконец, все узлы FiberNode, связанные с DomElement, обрабатываются, что приводит к следующему полному представлению узла FiberNode:
4.2 Повесить эффект текущего узла на конец эффекта returnFiber
Как описано в предыдущем объяснении базовой структуры данных, каждый FiberNode имеет свойства firstEffect и lastEffect, указывающие наEffect(副作用) FiberNode
связанный список. После обработки текущего узла и возвращения к родительскому узлу, подключите текущую цепочку к returnFiber. Наконец, в(HostRoot)FiberNode.firstEffect
Существует связанный список FiberNode со всеми смонтированными в нем побочными эффектами текущего дерева FiberNode.
5. Окончание этапа выполнения
После прохождения всех предыдущих процессов, наконец, (HostRoot)FiberNode также обрабатывается, возвращает (HostRoot)FiberNode и, наконец, какfinishedWork
вернуться кperformWorkOnRoot
, а затем перейти к следующему этапу.
6. Алгоритм планирования рендеринга — этап отправки
Так называемая фаза фиксации — это фаза, на которой фактически выполняются некоторые периодические функции и операции Dom.
Здесь также есть обход связанного списка, и обход представляет собой связанный список эффектов, сгенерированный на предыдущем этапе. Перед обходом, из-за инициализации, из-за(HostRoot)FiberNode.effectTag
дляCallback
(обратный вызов инициализации)), сначала поместит готовую работу в конец связанного списка. Структура выглядит следующим образом:
После того, как каждая часть отправлена, сбросьте узел обхода наfinishedWork.firstEffect
.
1. Зафиксировать операцию до того, как нода будет смонтирована (mount)
В настоящее время этот процесс обрабатывает только те, которые принадлежат ReactComponentgetSnapshotBeforeUpdate
метод.
2. Побочные эффекты (вставка, изменение, удаление) собственного узла ( Host ) на стороне фиксации
После перехода к узлу он решит, какую операцию выполнить в соответствии с effectTag узла.Операция включает в себя插入( Placement )
,修改( Update )
,删除( Deletion )
.
Поскольку в настоящее время это первый рендеринг, он войдет в процесс размещения, а остальная часть процесса будет объяснена позже в разделе «Как работает React (3) Процесс обновления».
2.1 Процесс введения (размещение)
Чтобы выполнить операцию вставки, необходимо сначала найти два элемента: родительский элемент DomElement и дочерний элемент DomElement.
2.1.1 Найдите ближайший родительский элемент DomElement относительно текущего узла FiberNode
пройти черезFiberNode.return
Продолжайте искать, найдите ближайший (HostComponent) FiberNode, (HostRoot) FiberNode, (HostPortal) FiberNode, а затем передайте(HostComponent)FiberNode.stateNode
,(HostRoot)FiberNode.stateNode.containerInfo
,(HostPortal)FiberNode.stateNode.containerInfo
Вы можете получить соответствующий экземпляр DomElement.
2.1.2 Найдите все ближайшие FiberNode относительно текущего游离子 DomElement
На самом деле цель состоит в том, чтобы найти все соседние (HostComponent) FiberNode и (HostText) FiberNode под текущим FiberNode, а затем получить дочерний элемент DomElement для вставки через свойство stateNode.
так называемый所有邻近的
, что можно понять из этой картинки:
Красная рамка на картинкеFiberNode.stateNode
, который является дочерним элементом DomElement, добавляемым к родительскому элементу DomElement.
Порядок обхода примерно такой же, как и в предыдущем поколении FiberNode Tree:
а) Посетите дочерний узел, пока не будет найденFiberNode.type
Для узла HostComponent или HostRoot получите соответствующий stateNode и добавьте его к родительскому элементу DomElement.
б) Найдите родственный узел, если он есть, посетите родственный узел и верните a).
c) Если узла-близнеца нет, посетить возвращаемый узел, а если return не является корневым узлом входного параметра текущего алгоритма, вернуть a).
г) Выход, если он возвращается к корневому узлу.
3. Измените идентификатор workInProgress/alternate/finishedWork.
Хотя это короткая строка кода, она очень важна, поэтому помечена отдельно:
root.current = finishedWork;
Это означает, что после обработки побочного эффекта DomElement предыдущий缓冲树
Задача была завершена, передана в качестве основной и стала следующим процессом пересмотра.current
. Давайте посмотрим на всю картину:
4. Зафиксировать операции загрузки и вызова жизненного цикла после изменений
В этом процессе также просматривается список эффектов, и для каждого типа узла будет выполняться различная обработка.
4.1 ClassComponent
Если у effectTag текущего узла есть флаг Update, вам необходимо выполнить метод жизненного цикла соответствующего экземпляра. На этапе инициализации, поскольку текущий компонент визуализируется впервые, он должен выполнитьcomponentDidMount
, иначе следует выполнитьcomponentDidUpdate
.
Как упоминалось ранее, в updateQueue также есть список эффектов. Он хранит обратные вызовы предыдущих обновлений, обычно полученные изsetState
второй параметр , илиReactDom.render
изcallback
. После выполнения вышеуказанной функции жизненного цикла начните обход списка эффектов и один раз выполните обратный вызов.
4.2 HostRoot
Операция аналогична второй части обработки ClassComponent.
4.3 HostComponent
Эта часть в основном касается фокуса первого загруженного HostComponent, если компонентautoFocus
Этот реквизит будет привлекать внимание.
7. Резюме
В этой статье в основном говорится оReactDom.render
Внутренний рабочий процесс, который описывает внутренний процесс первоначального рендеринга React:
- Создайте базовые объекты: ReactRoot, FiberRoot, (HostRoot)FiberNode.
- Создайте образ HostRoot и инициализируйте его через объект изображения
- Процесс инициализации управляет созданием дерева FiberNode с помощью ReactElement.
- Родительско-дочерний узел FiberNode через
child
,return
соединять - Brother Fibernode By.
sibling
соединять - Процесс создания дерева FiberNode, сначала глубина, создание одноуровневых узлов после окончания
- Как только конечный узел будет достигнут, начните создавать соответствующий экземпляр FiberNode, например, соответствующий экземпляр DomElement, экземпляр ReactComponent, и передайте экземпляр через
FiberNode.stateNode
Создайте ассоциацию. - Если экземпляр ReactComponent в настоящее время создается, вызов будет вызван
getDerivedStateFromProps
,componentWillMount
метод - После создания DomElement, если в дочернем узле FiberNode есть созданный DomElement, немедленно добавьте его к вновь созданному DomElement.
- После построения всего дерева FiberNode также создается соответствующее дерево DomElement, а затем начинается процесс отправки.
- В процессе создания Дерева ДомЭлемент текущий
副作用
Продолжайте идти вверх, на этапе отправки этот тег будет найден, и только что созданное дерево DomElement будет загружено в контейнер DomElement. -
双缓冲
Роли двух деревьев FiberNode Tree меняются местами, и исходный workInProgress становится положительным. - Выполнить метод жизненного цикла после загрузки соответствующего компонента ReactComponent.
componentDidMount
- Другие обратные вызовы, обработка автофокуса
В следующей статье будет описан механизм событий React (но он, как говорят, рефакторен), надеюсь, я не брошу фармить.
После написания первой статьи версия React достигла 16.5.0 …