最近学了些vue的原理课,想提炼一些比较重要的东西。把我看了两个半天的课,浓缩成3分钟。
vue响应式原理:
vue在初始化的时候,会深度遍历
data(){
retrun{
obj:{
a:1,
b:2
}
}
}
里的所有对象,使用es5语法里的defineProperty 进行定义,这就是为什么vue不支持ie8,因为ie8没有实现defineProperty
defineProperty
object.defineProperty 可以为对象创造一个属性,并使其拥有get和set方法,在get和set方法中,实现了一系列的响应式操作。
但是注意,只会在初始化的时候做遍历,所以之后通过 obj.c =3 创建的子级 是无法实现响应式的。
必须通过官方提供的 this.$set(this.obj,'c',3), 来进行一次 defineProperty绑定。
vue diff算法:
vue会在每一个方法函数执行完成之后,进行一次数据比对(diff算法),寻找出其中差异,再进行相关响应。
<img v-if='obj.a==1'/>
<img v-else/>
...
methods: { imageChange(){
this.obj.a=2;
this.obj.a=1;
}
}
在imageChange的执行过程中,页面dom并不会进行响应,只有当该函数执行完成后,才会进行一次虚拟dom的diff比较,执行最终的响应。
这就是我们为什么要使用 $nextTick,因为他使当前的流程进入到了异步的状态,结束了上一个函数的生命周期,使diff开始工作。
工作中,vue新手最容易出现的问题:- 传参问题,即第一个defineProperty。
- 生命周期,即第二个diff算法。
掌握了这两点,你就可以去忽悠那些对vue原理没有了解的面试官了!
ヾ(◍°∇°◍)ノ゙