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方法

  • 相关阅读:
    第一章-环境准备
    selenium-pageobject设计模式
    自动化测试用例设计原则
    selenium隔离环境安装、以及示例
    json extractor获取返回值中动态新增的数据
    jmeter返回值乱码问题
    liunx命令
    SQL表结构语句
    测试网络脚本python
    C# 订单流水号生成
  • 原文地址:https://www.cnblogs.com/qiuchuanji/p/8819060.html
Copyright © 2011-2022 走看看