zoukankan      html  css  js  c++  java
  • vue双向绑定的原理

    vue双向绑定的原理

    vue.js采用的是数据劫持结合发布和-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调

    Object.defineProperty()这个方法包含三个参数

    
    第一个参数:要设置的目标对象(必填)
    
    第二个参数:需要定义的属性或方法的名称(必填)
    
    第三个参数:目标属性所拥有的特性。(descriptor)(必填)
    
    
    Object.defineProperty(obj, "data", {
          //获取值
          get: function () {return name;},
          //设置值
          set: function (val) {name = val;console.log(val)}
    })
    //赋值调用
    setobj.data = 'aaa';
    //取值调用
    getconsole.log(obj.data);
    **代码演示:**
    **defineProperty的双向绑定**
    var obj={};
    Object.defineProperty(obj, 'val',{
          set:function (newVal) {
          document.getElementById("a").value =newVal==undefined?'':newVal;
          document.getElementById("b").innerHTML=newVal==undefined?'':newVal;}
    });
    document.getElementById("a").addEventListener("keyup",function (e) {obj.val = e.target.value;})
    

    实现mvvm的双向绑定,是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。就必须要实现以下几点:

    1、实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者
    2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
    3、实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
    4、mvvm入口函数,整合以上三者
    
  • 相关阅读:
    SqlServer 查看数据库中所有存储过程
    SqlServer 查看数据库中所有视图
    SqlServer 查询表的详细信息
    SqlServer 遍历修改字段长度
    net core 操作Redis
    Tuning SharePoint Workflow Engine
    Open With Explorer
    Download language packs for SharePoint 2013
    Change Maximum Size For SharePoint List Template when Saving
    Six ways to store settings in SharePoint
  • 原文地址:https://www.cnblogs.com/mxnl/p/13616549.html
Copyright © 2011-2022 走看看