Когда вы используете React.createElement()
†, вы создаете описание элемента для визуализации:
> React.createElement('div', [], "Hello, world!");
{ '$$typeof': Symbol(react.element),
type: 'div',
key: null,
ref: null,
props: { children: 'Hello, world!' },
_owner: null,
_store: {} }
Каждый из этих элементов может, в свою очередь, отображать другие элементы, образуя дерево .
Когда вы передаете узел root ReactDOM.render()
(и друзьям), ReactDOM превратит это описание элементов в первоначальный рендер и вставит его в DOM.
Когда в дереве происходит обновление, React будет повторно отображать всех его потомков (с некоторыми исключениями), и через процесс, называемый Согласование , React будет отличать новую версию от предыдущей версии, которую он представил , Затем React возьмет diff и применяет операции, необходимые для превращения старого состояния DOM в следующее желаемое состояние DOM.
Это хранилище в памяти представления текущего состояния DOM - это то, что мы имеем в виду, когда мы поговорим о «Виртуальном DOM».
Использование React.createElement()
- это , а не , что я лично считаю Virtual DOM, поскольку он фактически не является частью модели Virtual DOM, пока не будет передан render()
(либо непосредственно, либо будучи частью передаваемого дерева).
Вы можете найти информацию о расхождениях на странице Реакции для Согласование , и на странице есть более глубокое погружение о Оптимизация производительности .
Сноски:
† React.createElement('div', [], 'Hello, world!');
идентична <div>Hello, world!</div>
. Ваш компилятор скомпилирует JSX в серию React.createElement
вызовов.