• vuejs的双向数据绑定实现原理——object.defineproperty()


    视图和数据变化绑定

    而vue.js主要利用了accessor descriptors的set和get来更新视图,这里看到的这个例子挺好,是一个简单的绑定。
    对于一个html页面

    <div>
        <p>你好,<span id='nickName'></span></p>
        <div id="introduce"></div>
    </div>
    

     设置一个数据的属性的getter和setter

    //视图控制器
    var userInfo = {};
    Object.defineProperty(userInfo, "nickName", {
        get: function(){
            return document.getElementById('nickName').innerHTML;
        },
        set: function(nick){
            document.getElementById('nickName').innerHTML = nick;
        }
    });
    Object.defineProperty(userInfo, "introduce", {
        get: function(){
            return document.getElementById('introduce').innerHTML;
        },
        set: function(introduce){
            document.getElementById('introduce').innerHTML = introduce;
        }
    })
    
    
    

     然后就能愉快地绑定数据交互了。

    userInfo.nickName = "xxx";
    userInfo.introduce = "我是xxx,我来自云南,..."
    

    vue.js的数据变动

    但是,这个例子只是数据和dom节点的绑定,而vue.js更为复杂一点,它在网页dom和accessor之间会有两层,一层是Wacher,一层是Directive,比如以下代码。

    var a = { b: 1 }
    var vm = new Vue({ 
      data: data
    })
    
    把一个普通对象(a={b:1})传给 Vue 实例作为它的 data 选项,Vue.js 将遍历它的属性,用Object.defineProperty 将它们转为 getter/setter,如图绿色的部分所示。
    每次用户更改data里的数据的时候,比如a.b =1,setter就会重新通知Watcher进行变动,Watcher再通知Directive对dom节点进行更改。

     (原文地址:http://www.jianshu.com/p/07ba2b0c8fca)

  • 相关阅读:
    js异步加载服务端数据
    日期操作
    《jQuery实战》第2章 创建元素和包装集
    访问共享目录电脑盘符
    《jQuery实战》第4章 事件
    《jQuery实战》第3章 用JQuery让页面生动起来
    div + CSS 学习笔记
    WinJS Promise设置超时,可用于设置网络请求超时
    WinJS Base64编码和解码 metro
    Javascript Base64编码和解码
  • 原文地址:https://www.cnblogs.com/aliwa/p/7770560.html
Copyright © 2020-2023  润新知