vue 渲染原理是什么?

2017-05-31 13:58:27 +08:00
 yantianqi

从 new Vue 到最后 destroyed 页面
是怎么运行的,页面是怎么进行渲染的?
谢谢大神了

5470 次点击
所在节点    程序员
5 条回复
meepo3927
2017-05-31 15:58:26 +08:00
copperusher
2017-05-31 17:25:32 +08:00
用最简单的话来描述,就是用 MutationObserver 监控整个 DOM 树。在增加 DOM 结点时,创建对应的 Vue 组件;有事件发生时,调用 Vue 更新函数;在删除 DOM 结点时,销毁对应的 VUE 组件。
abcbuzhiming
2017-05-31 19:45:22 +08:00
@copperusher 根据这个论点,有一个问题是想不通的,就是当 vue 完成挂载后,你不能使用其他方式去直接操作 Dom 树,哪怕你删掉一个 dom 节点,然后增加一个完全一模一样的 Dom 节点,这个 Dom 节点原本可以由 Vue 控制的联动行为就回不来了,所以我觉得 Vue 的虚拟 Dom 似乎有些其它门道,应该不是单单在监控真实的 Dom 树本身,否则的话,我删掉一个 Dom 节点,又加一个一模一样的上去,为啥这个 Dom 节点,Vue 就失去控制了
Miy4mori
2017-05-31 19:54:12 +08:00
@abcbuzhiming vue 是 mvvm 框架,真实 dom 肯定是通过虚拟 dom 渲染的,你操作了真实 dom 应该就改变了 hash,影响了 diff 算法,所以会失去控制,以上都是我瞎猜的。
funnyecho
2017-06-01 08:51:23 +08:00
门道也不复杂。

我简单的理解是:

Vue 做 diff 是基于 vnode tree 而不是真是的 dom 节点,diff 结果再 patch 到 dom 节点上。

而每个节点在 mount 到 document 前都已经被 vnode.elm 引用了,所以,即使你删掉 dom 节点,该对象还是在 js 内存中,所以,往后的 diff patch 都会作用到这个只存在与内存中的 node 对象而不会反映到真实的 dom tree 中了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/364912

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX