javascript - 我对使用 React JS 和 Virtual DOM 处理重新渲染感到困惑
问题描述
我正在使用 React JS,但我需要了解更多关于 Virtual DOM 及其好处的信息。
显然,在 Real DOM 中,对于 UL 的每次更改,父级和子级都应该重新渲染......
例如考虑以下代码:
<ul>
<li>List item</li>
<li>List item</li>
<li>List item</li>
</ul>
为了向这个 UL 列表中添加一个项目,在使用ul.appendChild(li)
所有重新渲染到 Browser 的 UL 之后,将一个新的 Li 项目添加到这个列表中。这需要时间并且有性能问题。因为在 Web 中,我们不仅有一个 UL,而且可能有很多元素,并且该 UL 列表可能非常复杂。
但是对于虚拟 DOM,React 会截取我们的 DOM,并且对于 JSX 中的每个更改都有一个比较并找到将新 Li 添加到 UL 列表中的最佳方法。
例如对于上面的 UL 列表,要在 latest 之后添加新项目可以使用这个:
latestLi.parentNode.insertBefore(newElement, element);
上面的代码意味着,React 想要在最新元素之后或之前添加新项目,并且所有 UL 和孩子永远不会重新渲染到浏览器中......
取而代之的是:
ul.appendChild(li);
所以在这个解释之后,我对虚拟 DOM 是否理解正确,或者我需要研究这个概念是不正确的,我有误解和错误?!
谢谢
解决方案
“React 对我们的 DOM 进行截图”——不是截图,而是快照。也就是说,它需要一份 DOM 的副本。当您通过渲染组件对虚拟 DOM 进行更改时,React 会执行 diff 操作并且仅重新渲染更改的 DOM 部分。这是高度优化和高效的。
请注意,实际上,您无需了解 Virtual DOM 的工作原理即可编写 React 代码。只需了解它有自己的 DOM,这就是为什么您需要做一些与纯 JavaScript 略有不同的事情,例如使用 'refs' 来处理 React DOM 无法处理的某些类型的更新。
推荐阅读
- javascript - 引导弹出效果不调用
- c++ - 控制台不会停止要求输入
- python - Celery Workers 没有使用 Django 将所有事务写入数据库
- webstorm - WebStorm 项目目录作为本地服务器的资源根目录
- db2 - 用于创建用户的 Db2 查询
- mysql-workbench - 如何更改 Windows 的选项文件 (my.ini) 位置?
- javascript - Phaser 3 创建一个带有分和秒的游戏时钟
- selenium - 无法从网站 https://demoqa.com/webtables 的 web 表中检索数据
- r - RMarkdown 投影仪和目录
- graphviz - 如何只写一次长标签,并在图中使用对它们的引用?