Vue原理学习(二)

响应式系统的基本原理

Vue基于Object.defineProperty来实现响应式,对于Object.defineProperty大家就算不熟悉也听说过,我之前的文章也详细介绍过。

语法大家参考文档即可。

在上次的Vue原理学习(一)中,我们画了一张图,其中有一个_init的过程,也就是new Vue之后。

_init的过程,会对数据进行响应式的处理。

我们先来看看代码:

function defineDispose(obj, key, val) {
    Object.defineProperty(obj, key, {
      enumerable: true, // 可枚举
      configurable: true, // 可配置、可重写
      get: function() {
        return val; // 返回value,在这里Vue会产生依赖收集
      },
      set: function(newVal) {
        if(newVal === val) return
        cb(newVal)
      }
    })
}

这里我们用一个函数对Object.property进行了简单的封装,并且在set的时候,调用了一个cb函数。

// cb函数
function cb (newVal) {
    console.log('数据发生了更新: ' + newVal);
}

到这里,虽然代码可以正常工作,但是依然是不够的,我们需要在封装一层observer。传入一个value,也就是需要响应式的对象,在通俗点说,就是new Vue()的时候, 传入的那个参数对象。

function observer(value) {
    Object.keys(value).forEach(key => {
        // 调用defineDispose函数
        defineDispose(value, key, value[key]);
    })
} 

这里,我们使用遍历来对每个对象属性进行了Object.defineProperty处理,也就是响应式处理,当然,这个实际的过程会复杂很多,比如需要对数据类型判断、算法处理等等。

最后,我们实现可以通过new Vue的方式来初始化对象:

class Vue{
    // 构造函数
    constructor(options) {
         this._data = options.data; // 只对data处理
         observer(this._data); // 调用observer
    }
}

最后我们来调用一下:

let vue = new Vue({
    data: {
        title: '中国第一艘国产航母13日清晨离开码头 开始海试'
    }
});
// 更新数据
vue._data.title = '中超-恒大2-2华夏近4场不胜 鲁能压哨平权健';
// 此时会调用cb函数打印如下数据: 
// 数据发生了更新: 中超-恒大2-2华夏近4场不胜 鲁能压哨平权健  

这里,我们对Vue的响应式有了一个基本的认识,整个过程也为我们复习了Object.defineProperty。当然,实际的过程会比这复杂的多。

在刚才的代码中,我们发现,必须使用_data的改变才可以,但是Vue中却可以直接使用this.xxx,实际上Vue本质也是 _data,只不过是使用了数据代理,将_data代理到了data上。

嗯嗯嗯嗯嗯。

以上笔记是我 阅读 掘金小册 所得。
链接:https://juejin.im/book/5a36661851882538e2259c0f?inviteCode=596197525188257fd215e23e

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 10,478评论 0 29
  • 深入响应式 追踪变化: 把普通js对象传给Vue实例的data选项,Vue将使用Object.defineProp...
    冥冥2017阅读 10,309评论 6 16
  • 期中考试算是告一段落了,据我妈说,家长会时严嘉嘉的爸爸还上台来了一段教子方法论指导,但以我对我妈的了解,她估计一个...
    百里流笙阅读 1,594评论 0 1
  • 我想成为那瓶装的香水 因为在喷洒出来后 能始终萦绕在你脖颈 挥之不去 终日缠绵 我想成为那盛着红酒的酒杯 因为那是...
    夏日回忆限定阅读 1,715评论 0 1

友情链接更多精彩内容