zoukankan      html  css  js  c++  java
  • 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方法

  • 相关阅读:
    android 文件上传
    windows去掉开机输入用户名密码
    获取数据时候的滚动条加载……
    服务器标记不正确?在aspx页面如何绑定cs端的参数或绑定
    使用vs2003进行web开发的时候碰到的一些小问题
    c#实现Winform中的分页
    showModalDialog弹出页面以及子页面回传值的问题
    中文传值乱码问题
    引用的类“Infragistics.WebUI.UltraWebTab.UltraWebTab”具有在未被引用的程序集中定义的基类或接口“Infragistics.WebUI.Shared.IUltraLicensedComponent”
    ERwin7.1学习笔记之-
  • 原文地址:https://www.cnblogs.com/qiuchuanji/p/8819060.html
Copyright © 2011-2022 走看看