Vue 响应式原理(双向数据绑定原理)

Vue 的双向数据绑定是通过数据劫持和发布-订阅模式实现的。首先,Observer 使用 `Object.defineProperty()` 对数据进行监听,创建响应式数据。当数据变化时,触发订阅者Watcher的更新方法,完成视图更新。Compile负责解析模板,初始化页面并绑定数据订阅者。Watcher作为Observer和Compile之间的桥梁,负责收集依赖并在数据变化时更新视图。
摘要由CSDN通过智能技术生成

vue 中的双向数据绑定其实就是在单向数据绑定的基础上,给可输入元素(input textare) 等添加change事件,来动态改变绑定的Model 以及视图。

先来一张结构图:

 首先,这个vue 是通过数据劫持结合发布者-订阅者模式来实现的双向绑定。首先通过Object.defineProperty() 给每个属性绑定getter / setter 。当数据发生变化时,发布消息给订阅者,出发相应的回调函数,完成视图更新。

1、数据监听器Observer

源码里面是这样的:

先是处理对象数据,先遍历对象的key 然后通过响应式函数defineReactive 实现响应式数据,内部的原理依然是Object.defineProperty() 实现的,此时数据都是响应式的,也就是说我们可以监听到数据的变化了

function observe(data) {
    //先不考虑数组的情况
    if (!data || typeof data !== 'object') {
        return;
    }
    // 取出所有属性遍历
    Object.keys(data).forEach(function(key) {
        defineReactive(data, key, data[key]);
    });
};

function defineReactive(data, key, val) {
    observe(val); // 监听子属性
    Object.defineProperty(data, key, {
        enumerable: true, // 可枚举
        configurable: false, // 不能再define
        get: function() {
            return val;
        },
        set: function(newVal) {
            console.log('哈哈哈,监听到值变化了 ');
            val = newVal;
        }
    });
}

接下来,当监听到数据的变化之后,我们需要通知订阅者,以完成相关的数据更新;

如何通知订阅者?我们要实现一个消息订阅器,用来收集消息订阅者,当数据变动时,就触发notify(), notify() 会调用订阅者的 update()  方法,完成视图更新ÿ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值