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

  • 相关阅读:
    c++深拷贝与浅拷贝
    c++构造函数的explicit
    c++虚函数和虚函数表
    c++重载、重写、隐藏(重定义)
    c++传值、传指针、传引用
    ASP.Net Core API 学习の中间件
    WPF中String Format的用法
    ASP.Net Core API 全局处理异常
    989. Add to Array-Form of Integer
    1014. Best Sightseeing Pair
  • 原文地址:https://www.cnblogs.com/aliwa/p/7770560.html
Copyright © 2011-2022 走看看