手寫簡(jiǎn)化版vue2響應(yīng)式原理:

實(shí)現(xiàn)訂閱模型:

// 訂閱型模型
let Dep = {
     //訂閱模型三個(gè)重要組成部分:1.容器 2.添加訂閱 3.發(fā)布訂閱
     //容器
     containterlist :{},
    //添加
    listen:function(key,fn){
         // if(!this.containterlist [key]){  
        //   this.containterlist [key] = [];
        // }
        // this.containterlist [key].push(fn);
        //以上等同于下面
        (this.containterlist [key] || (this.containterlist [key]=[])).push(fn);
    },
    //發(fā)布
    trigger:function(){
         let key  = Array.prototype.shift.call(arguments),
        fns = this.continterList[key];
         if(!fns || fns.length ===0){
              return false;
        }
        for(let i =0,fn;fn=fns[i++];){
              fn.apply(this,arguments);
        }
    }
}

//數(shù)據(jù)劫持

    let dataWatch = function({data,tag,datakey,selector}){
      let value = "",
      el = document.querySelector(selector);
     Object.defineProperty(data,datakey,{
        //取值
        get:function(){
              console.log("取值");
              return value;
          },

        set:function(val){
          console.log("設(shè)置值");
          value = val;
          //發(fā)布
          Dep.trigger(tag,val);
        }
      })
      //訂閱
      Dep.listen(tag,function(text){
        el.innerHTML = text;
      })
}

測(cè)試:

image
image

數(shù)據(jù)綁定:

更新或新增data中某屬性值,界面涉及到該屬性的節(jié)點(diǎn)都會(huì)更新。

數(shù)據(jù)劫持(v-model):

Object.defineProperty()

vue2的響應(yīng)式原理:

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容