新旧节点对比,如果不是相同的节点则删除后重新创建
↱¯¯¯¯¯¯¯¯¯↴
DOM A [B] C D [B]
prevList a b c d
newList a c d b
DOM A B [+C] D
prevList a b d
newList a b c d
DOM A B [-C] D
prevList a b c d
newList a b d
目前的reactDiff的时间复杂度为O(m*n),我们可以用空间换时间,把key与index的关系维护成一个Map,从而将时间复杂度降低为O(n)
M (model):模型对象:指的是构成界面内容的相关数据 V(view): view: 视图对象:指的是给用户或者开发者展示数据的界面 VM(viewmodel): 视图模型对象:是view与model之间的桥梁
MVVM就是通过 数据劫持 + 发布订阅模式 实现双向绑定。数据驱动视图具体过程为 监听数据变化 -> 收集依赖 -> 通知依赖更新 三个步骤。
当 new 一个 vue 实例的时候,vue会调用 _init() 方法进行初始化(vue的声明周期、事件、props、data、compute、watch等,最重要的是)初始化会通过 Object.defineProperty来设置 getter 和 setter 函数。(getter 函数用于依赖收集,setter函数用于通知内部所有的 Watcher 对象进行视图更新)
当组件被渲染时,会去读取所需数据,这个读取操作会触发 getter 函数, getter函数会进行 依赖收集。依赖收集的过程就是把 Watcher 实例放到 Dep(依赖收集器)中(Dep 调用 addSub方法)。 当数据被修改时,会触发 setter 函数,setter 函数会通知 Dep(依赖收集器)有数据变化了,Dep会找到对应的 Watcher 进行更新(Dep 调用 notify 方法,调用 Watcher update方法)
初始化:调用 new Vue() 后 vue 会调用 _init() 函数进行初始化,它会初始化生命周期、事件、 props、 methods、 data、 computed 与 watch 等。其中最重要的是通过 Object.defineProperty 设置 setter 与 getter 函数,用来实现「响应式」以及「依赖收集」
挂载组件:初始化之后会调用 $mount 挂载组件,如果是运行时编译,即不存在 render function 但是存在 template 的情况,需要进行 compile 步骤
vue2.x使用的是双端比较,所谓双端比较就是新列表和旧列表两个列表的头与尾互相对比,,在对比的过程中指针会逐渐向内靠拢,直到某一个列表的节点全部遍历过,对比停止。
newList d b a c ↑ ↑ ```
↙¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯↖
DOM [+D] A B C [-D]
↓ ↓
prevList a b c d
newList d b a c
↑ ↑
DOM D A B C
↓ ↓
prevList a b c d
newList d b a c
↑ ↑
↗¯¯¯¯¯¯¯↘
DOM D [-A] B [+A] C
↓
prevList a b c d
newList d b a c
↑
DOM A B C D
↓ ↓
prevList a b c d
newList b e a c f
↑ ↑
DOM [+B] A [-B] C D
↓ ↓
prevList a - c d
newList b e a c f
↑ ↑
DOM B [+E] A C D
↓ ↓
prevList a - c d
newList b e a c f
↑ ↑
DOM B E A C F D
↓↓
prevList a - c d
newList b e a c f
↑ ↑(头index)
DOM A B C
(尾index)↓ ↓
prevList a b c
newList d a b c
↑↑
经过前置与后置元素预处理后就可以计算出剩余的节点的最长递增子序列了,具体操作如下
DOM A B C D F E
↓ ↓
prevList a b c d f e
newList a c d b g e
↑ ↑
source [-1 -1 -1 -1]
DOM A B C D [-F] E
↓ ↓
prevList a b c d f e
newList a c d b g e
↑ ↑
source [ 2 3 1 -1]
DOM A B C D [-F] E
↓ ↓
prevList a b c d f e
newList a c d b g e
↑ ↑
source [ 2 3 1 -1]
Lis [ 0 1 ]
newList a c d b g e ↑ ↑ source [ 2 3 1 -1] Lis [ 0 1 ] ```