Vue全体実現プロセス

4277 ワード

1.解析テンプレートをrender関数にする
  • <div id="app">
        <p>{{price}}</p>
    </div>
    // render  
    with(this){  // this vm
      return _c(
        'div',
          {
              attrs: {"id": "app"}
          },
          [
              _c('p', [_v(_s(price))])
          ]
      )
    }
    
  • テンプレートのすべての情報はrender関数によって
  • を含む.
  • テンプレートで使用するdataの属性は、js変数
  • になります.
  • テンプレートのv-model,v-for,v-onはjsロジック
  • になりました.
  • render関数はvnode
  • を返します.
    2.応答型リスニング開始
  • Object.definePropertyは、通常のJavaScriptオブジェクトをVueインスタンスのdataオプションに渡すと、vueはこのオブジェクトのすべての属性を遍歴し、Objectを使用します.definePropertyは、これらのプロパティをすべてgetter/setterに変換します.これらのgetter/setterはユーザーにとって表示されませんが、内部ではvueに依存を追跡させ、属性がアクセスされ、変更されたときに変化を通知します.
    //     vue  data  
    var obj = {};
    var data = {
        price: 100,
        name: 'zhangsan'
    };
    var key, value;
    for (key in data) {
        //     ,      ,  key      
        (function (key) {
            Object.defineProperty(obj, key, {
                get: function() {
                    console.log('get', key);
                    return data[key];
                },
                set: function(newVal) {
                    console.log('set', newVal);
                    data[key] = newVal;
                }
            })
        })(key)
    }
    
  • dataの属性をvm上の
  • にエージェントする
    3.最初のレンダリング、ページの表示、ページのバインド
  • 初回レンダリング、updateComponent、vm._を実行render()
    vm._update(vnode) {
        const prevVnode = vm._vnode;
        vm._vnode = vnode;
        if (!prevVnode) {
            vm.$el = vm._patch_(vm.$el, vnode);
        } else {
            vm.$el = vm._patch_(prevVnode, vnode);
        }
    }
    function updateComponent() {
        vm._update(vm._render());
    }
    
  • render関数を実行するとvmにアクセスする.listとvm.title
  • は応答式のgetメソッドによってなぜgetを傍受するのか、setを直接傍受してはいけませんか?dataには多くの属性があり、使用されていないものもあり、使用されていないものはgetに移動し、使用されていないものはgetに移動せず、getに移動していない属性もあります.setの場合、私たちも関心を持つ必要はありません.このように、不要な繰り返しレンダリングを避けることができます.
  • updateComponentを実行すると、vdomのpatchメソッド
  • に進みます.
  • patchはvnodeをDOMにレンダリングし、初回レンダリングは
  • を完了する.
    4.data属性変化、rerenderトリガー
  • 属性の変更は応答式setによって
  • に傍受される.
  • setでupdateComponent
  • を実行
  • updateComponent再実行vm.render()
  • で生成するvnodeとprevVnodeをpatchで比較する
  • .
  • htmlで
  • をレンダリング