当我们使用 JSX <div></div>或 React.createElement( "div" , ...) 时,这是虚拟 DOM(元素)吗?



当我们使用JSX 时

let el = <div></div>;

let el = React.createElement('div', ...);

(它们完全相同,AFAIK)。el<div></div>是虚拟DOM(元素),还是虚拟DOM意味着其他东西?所以我的问题是,<div></div>会成为虚拟DOM的一部分吗?React.createElement()创建一个对象。这个对象会成为虚拟DOM(树)的一部分吗?

我想知道虚拟DOM是指整个树还是存储所有元素的虚拟文档对象模型。当我们说ReactDOM.render(<Foo />, rootEl)时,它将虚拟DOM元素呈现为虚拟DOM树和实际DOM树。(就像let el = document.createElement()创建实际的DOM元素,document.body.appendChild(el)将DOM元素添加到DOM树中一样。)所以<div></div>React.createElement('div', ...)创建的东西将成为虚拟DOM的一部分。

当您使用React.createElement()†时,您可以创建要渲染的元素的描述:

> React.createElement('div', [], "Hello, world!");
{ '$$typeof': Symbol(react.element),
type: 'div',
key: null,
ref: null,
props: { children: 'Hello, world!' },
_owner: null,
_store: {} }

这些元素中的每一个都可以依次渲染其他元素以形成

当您将根节点传递给ReactDOM.render()(和朋友)时,ReactDOM会将元素的描述转换为初始呈现,并将其插入到DOM中。

当树中发生更新时,React将重新渲染其所有子代(只有少数例外),并且通过一个名为"协调"的过程,React会将新版本与其渲染的前一版本进行区分。React将获取diff并应用将旧DOM状态转换为下一个所需DOM状态所需的操作。

当我们谈论"虚拟DOM"时,DOM的当前状态表示的内存存储就是我们的意思。

使用React.createElement()是我个人认为的虚拟DOM的而不是,因为在它被传递给render()(直接或作为传递的树的一部分)之前,它实际上并不是虚拟DOM模型的一部分。

您可以在React页面上找到有关难题的信息,并在该页面上深入了解有关优化性能的信息。


脚注:

React.createElement('div', [], 'Hello, world!');<div>Hello, world!</div>相同。编译器将把JSX编译成一系列React.createElement调用。

它们是相同的,但当您有很多元素时,使用JSX更可读。这就是为什么它被称为语法糖,它可以帮助你拥有一个更好的结构化代码,你可以很容易地阅读。

最新更新