男神,求教!!!

来源:5-4 计算属性 VS 侦听属性(4)

鸡肋2016

2018-10-26

老师你好!
我好奇,问一些问题!
1、虚拟Dom通过对新旧vnode的diff算法比较,修改vnoe.elm。修改vnoe.elm同步就修改了真实dom了吗?还是vnode.elm也只是保存修改,最后把对vnode.elm的修改全部更新到真实Dom上。
2、之前了解到js中的createDocumentFragment() ,把dom保存在其中进行修改,修改完了一次性通过其更新到dom,能提升速度性能,vue有用到这个吗?
2、vue1.0没有虚拟dom的时候,双向绑定后视图更新,组件内改变了一个数据,它是怎么更新的?

写回答

2回答

ustbhuangyi

2018-10-26

1. vnode.elm 是组件的 root vnode 保存的 DOM 引用,相当于组件对应的 DOM。
2. Vue 没有用 createDocumentFragment
3. 1.0 数据响应部分和 2.0 类似,只不过少了 Vitual DOM 这一层,直接去操作 DOM

0
0

鸡肋2016

提问者

2018-10-26

新增一个问题
        1、没有数据驱动。我们平时操作dom也是最精准的操作,相当于虚拟dom通过diff算法计算出来的操作。缺点是除了没有数据驱动带来的好处,多次频繁更新dom性能不行。这个也有解决方案,通过js的createDocumentFragment()优化性能。但我们就是要数据驱动带给我的好处呀!
        2、有数据驱动后,没有虚拟dom。我不知道vue1.0怎么更新dom的。猜想是:一旦1个组件某个数据变更,直接整个组件替换重新渲染吗?!理由是,因为组件Watcher订阅数据变化通过Watcher更新,但不知道哪个节点变化了只能把订阅这个数据的组件全部替换。
        3、有数据驱动后有虚拟dom。虚拟dom除了跨平台跨服务端外。给数据驱动的情况通过diff算法提供了更精准的dom更新策略是这样吗?patch时候,对比新旧vnode,修改的vnode.elm应该也只是做一个保存吧?!最后对比修改完了才通过vnode.elm全部一次性更新到浏览器。
        所以结论是虚拟dom除了跨平台跨服务端外。是因为我们需要数据驱动的前提下,提供了更精准的dom更新策略。
        前面是我的理解和猜想!

0
1
ustbhuangyi
Vue 的数据更新都是组件级别的,因为可以基于它的依赖跟踪,把要观测变化的响应式数据的依赖都收集到组件 render watcher 中,所以组件的某个数据变了就会触发组件的 re render,是组件粒度的更新。 Virtual DOM 更大的意义是跨平台,它对 DOM 的更新算法是相对高效,但并不一定是最优的,你可以理解为提供了一个还不错的性能。它也不是什么精准更新,而是根据 diff 算法的结果,选择一个更新的策略
2018-10-26
共1条回复

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4984 学习 · 1037 问题

查看课程