vue源码学习第一篇--理解双向数据绑定原理

一、原理

(1)vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式 的方式来实现的, 也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;

代码:
在这里插入图片描述
在这里插入图片描述

(2)核心:通过 Object.defineProperty() 方法;

(3)介绍 Object.defineProperty() 的使用方法:

  • Object.defineProperty(obj, prop, descriptor) ,这个语法内有三个参数,分别为 obj(要定义其上属性的对象) prop (要定义或修改的属性) descriptor (具体的改变方法),简单地说就是用这个方法来定义一个值。当调用时我们使用了它里面的get方法,当我们给这个属性赋值时,又用到了它里面的set方法;

二、先简单的实现一个js的双向数据绑定来熟悉一下这个方法:

<body>
    <div id="app">
        <input type="text" id="a">
        <span id="b"></span>
    </div>
</body>
<script>
    var obj = {};  //定义一个空对象

    var val = 'zhao';  //赋予初始值

    Object.defineProperty(obj, 'val', {//定义要修改对象的属性

        get: function () {

            return val;
        },

        set: function (newVal) { 

             val = newVal;//定义val等于修改后的内容

            document.getElementById('a').value = val;//让文本框的内容等于val
            
            document.getElementById('b').innerHTML = val;//让span的内容等于val

        }

    });
    document.addEventListener('keyup', function (e) {//当在文本框输入内容时让对象里你定义的val等于文本框的值

        obj.val = e.target.value;

    })

</script>

这个例子实现的效果是:随着文本框输入文字的变化,span中会同步显示相同的文字内容;这样就实现了 model => view 以及 view => model 的双向绑定。
通过添加事件监听keyup来触发set方法,而set再修改了访问器属性的同时,也修改了dom样式,改变了span标签内的文本。

三、发布与订阅

vue在双向绑定的设计中,采用的是 观察-订阅模式,前面所讲的数据劫持,其实就是为属性创建了一个观察者对象,监听数据的变化。接下来就是创建发布类和订阅类,如下:
在这里插入图片描述
observer,创建数据监听,并为每个属性建立一个发布类。

Dep是发布类,维护与该属性相关的订阅实例,当数据发生更新时,会通知所有的订阅实例。

Watcher是订阅类,注册到所有相关属性的Dep发布类中,接受发布类的数据变更通知,通过回调,实现视图的更新。

举个例子:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值