浅谈浅谈Vue 数据响应式原理数据响应式原理
前言前言
Vue的数据响应主要是依赖了Object.defineProperty(),那么整个过程是怎么样的呢?以我们自己的想法来走Vue的道路,其实
也就是以Vue的原理为终点,我们来逆推一下实现过程。
本文代码皆为低配版本,很多地方都不严谨,比如 if(typeof obj === ‘object’)这是在判断obj是否为为一个对象,虽然obj也有可
能是数组等其他类型的数据,但是本文为了简便,就直接这样写来表示判断对象,对于数组使用Array.isArray()。
改造数据改造数据
我们先来尝试写一个函数,用于改造对象:
为什么要先写这个函数呢? 因为改造数据是一个最基础也是最重要的步骤,之后所有的步骤都会依赖这一步。
// 代码 1.1
function defineReactive (obj,key,val) {
Object.defineProperty(obj,key,{
enumerable: true,
configurable: true,
get: function () {
return val;
},
set: function (newVal) {
//判断新值与旧值是否相等
//判断的后半段是为了验证新值与旧值都为NaN的情况 NaN不等于自身
if(newVal === val || (newVal !== newVal && value !== value)){
return ;
}
val = newVal;
}
});
}
例如const obj = {},然后再调用defineReactive(obj,’a’,2)方法,此时在函数内,val=2,然后每次获取obj.a的值的时候都是获取
val的值,设置obj.a的时候也是设置val的值。(每次调用defineReactive都会产生一个闭包保存了val的值);
流程讨论流程讨论
经过验证之后,发现这个函数确实可以使用的。然后我们来讨论一下响应的流程:
输入数据
改造数据(defineReactive())
如果数据变动 => 触发事件
我们来看第三步,数据变动如何触发之后的事件呢?仔细思考一下,如果要改变数据,那么必须先set数据,那么我们直接
set()里面添加方法就ok了呀。
然后还有一个重要问题: