Vue源码分析(双向数据绑定)笔记01

Vue是一个提供了MVVM风格的双向数据绑定的Javascript库,专注于View层,也就是视图层。它的核心在于VM,不直接去操作DOM,而是将Model和View连接起来,保证视图和数据的一致性。

Vue的核心是采用 es6的Object.defineProperty来实现双向数据绑定的。

一、一个简单的双向数据绑定

<input type="text" value="我" class="txt">
输入:<span class="textSpan"></span>

let obj = {
        foo: 'foo'
 };
 let textInput = document.querySelector('.txt');
 let textSpan = document.querySelector('.textSpan');
    Object.defineProperty(obj, 'foo', {
        set: function (newVal) {
            console.log('当前值为', newVal);
            textInput.value = newVal;
            textSpan.innerHTML = newVal;
        },
        get: function () {
            console.log('将要读取obj.foo属性');
        }
    });
    // 将要读取obj.foo属性
    obj.foo;
    // 当前值为 name
    obj.foo = 'name';

    textInput.addEventListener('keyup', function (e) {
        obj.foo = e.target.value;
    });

 最终效果:

实现一个简单的数据双向绑定还是不难的: 使用Object.defineProperty()来定义属性的set函数,属性被赋值的时候,修改Input的value值以及span中的innerHTML;然后监听input的keyup事件,修改对象的属性值,即可实现这样的一个简单的数据双向绑定。

上述是一个单个对象的双向数据绑定,可是我们在项目中能看到那种对象有多个参数的,那这又是怎么实现的呢

<input type="text" class="txt">
let txtInput = document.querySelector('.txt');
let vue = {
    data: {
        name: '我是vue',
        age: '2'
    }
};
let data = vue.data;
for (let prop in data) {
    data['__' + prop] = data[prop]; //存储私有属性
    Object.defineProperty(data, prop, {
       enumerable : true,
       set: function (newVal) {
           console.log('你正在修改'+prop + ' !...操作DOM...');
           // 数据校验
           this['__' + prop] = newVal;
       },
       get: function () {
           console.log('getter 获取值 ...');
           return this['__' + prop];
       }
       });
} txtInput.addEventListener('keyup',function(e)
{ data.title = e.target.value; console.log('这里会调用get方法'+data.title) });

效果如下:

从上面的两个例子可以看出来,Object.defineProperty是vue的核心,下面我们来简单了解一下它:

语法

Object.defineProperty(obj, prop, descriptor)

参数:

obj 
被定义或修改属性的对象;

prop 
要定义或修改的属性名称;

descriptor 
对属性的描述

描述符还提供了setget方法,当被监控的对象发生了改变,那么就会调用set方法,调用对象就会触发get方法

原文地址:https://www.cnblogs.com/qiuchuanji/p/8819060.html