Vue 生命周期

MVVM 的三大要素

響應(yīng)式: vue 如何監(jiān)聽(tīng)到 data 的每個(gè)屬性變化?

什么是響應(yīng)式

  • 演示
<div id="app">
  <p>{{name}}</p>
  <p>{{age}}</p>
</div>
var vm = new Vue({
  el: "#app",
  data: {
    name: "hank",
    age: "18"
  }
});
思考
  • 修改 data 屬性后, vue 怎么立刻監(jiān)聽(tīng)到 data 的屬性修改
  • data 屬性 怎么代理到 vue 上的, 即 vm.name 怎么能獲取到 data 里的屬性

Object.defineProperty

var obj = {};

(function(obj) {
  // 定義一個(gè)內(nèi)部變量 , 外部無(wú)法訪(fǎng)問(wèn)
  var _name = "hank";

  // 使用 defindProperty 定義屬性
  Object.defineProperty(obj, "name", {
    // 當(dāng) obj.name 獲取的時(shí)候調(diào)取 get 方法
    get: function() {
      console.log("get", _name); // 監(jiān)聽(tīng)
      return _name;
    },
    // 當(dāng) obj.name 設(shè)置的時(shí)候調(diào)取 set 方法
    set: function(newVal) {
      console.log("set", newVal); // 監(jiān)聽(tīng)
      _name = newVal;
    }
  });
}(obj)

console.log(obj.name)
// console 先打印 => gethank
// console 然后打印 obj.name 的值 => hank

obj.name = 'chang'
// console 先打印 => setchang
// 然后 obj.name 的值才被更改為 chang

模擬

var vm = {};
var data = {
  name: "hank",
  age: 18
};

// 把遍歷要用到的變量先聲明, 讓代碼更直觀(guān).
var key;
for (key in data) {
  // 閉包的使用, 綁定 key 的值,
  (function(key) {
    Object.defineProperty(vm, key, {
      get: function() {
        console.log("get", data[key]); // 監(jiān)聽(tīng)
        return data[key];
      },
      // 監(jiān)聽(tīng) 在這里可以做操作 比如修改DOM的內(nèi)容, 實(shí)現(xiàn)vue的效果
      set: function(newVal) {
        console.log("set", newVal);
        data[key] = newVal;
      }
    });
  })(key);
}

模板引擎: vue 的模板如何被解析, 指令如何處理

  • 模板是什么
    • 模板的本質(zhì)就是 字符串
    • 有邏輯的
    • 最終轉(zhuǎn)化為一個(gè) js 函數(shù) (render 函數(shù))

渲染: vue 的模板被渲染成 html, 以及渲染過(guò)程

vue 的整個(gè)實(shí)現(xiàn)流程

  1. 解析模板成 render 函數(shù)
  2. 響應(yīng)式開(kāi)始監(jiān)聽(tīng)
  3. 首次渲染, 顯示頁(yè)面, 且綁定依賴(lài)
  4. data 屬性變化, 觸發(fā) rerender

解析模板成 render 函數(shù)

  • 模板中所有的信息都被 render函數(shù)包含
  • 模板中用到的 data 中的屬性, 都被變成了 js變量
  • 模板中的 v-model v-for v-on 都變成了 js邏輯
  • render 函數(shù)返回 vnode

響應(yīng)式開(kāi)始監(jiān)聽(tīng)

  • Object.defindProperty
  • 將 data 屬性代理到 vue 實(shí)例上

首次渲染, 顯示頁(yè)面, 且綁定依賴(lài)

  • 初次渲染, 執(zhí)行 updateComponent, 執(zhí)行 vm._render()
  • 執(zhí)行 render 函數(shù), 會(huì)訪(fǎng)問(wèn)到 vm.list 和 vm.title
  • 會(huì)被響應(yīng)式的 get 方法監(jiān)聽(tīng)到
  • 執(zhí)行 updateComponent, 會(huì)走到 vdom 的 patch 方法
  • patch 將 vnode 渲染成 DOM, 初次渲染完成

為什么監(jiān)聽(tīng) get

  • data 中有很多屬性, 有些被用到, 有些可能不會(huì)被用到
  • 未被用到的屬性, set的時(shí)候我們也無(wú)需關(guān)心
  • 避免不必要的重復(fù)渲染
?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,167評(píng)論 0 29
  • vue生命周期總共分為8個(gè)階段創(chuàng)建前/后,載入前/后,更新前/后,銷(xiāo)毀前/后。 創(chuàng)建前/后: 在beforeCre...
    雨蒙_snow閱讀 1,384評(píng)論 0 1
  • 什么是生命周期? Vue實(shí)例有一個(gè)完整的生命周期,也就是從開(kāi)始創(chuàng)建、初始化數(shù)據(jù)、編譯模板、掛載Dom、渲染→更新→...
    travelClark閱讀 2,657評(píng)論 0 36
  • 托爾斯泰曾經(jīng)說(shuō)過(guò):“幸福的家庭都是相似的,而不幸的家庭各有各的不幸”,這句話(huà)被很多人視為至理名言,但是如果我們?cè)龠M(jìn)...
    Rayman_6e85閱讀 311評(píng)論 0 2
  • 如何制定一個(gè)行之有效的計(jì)劃? 首先要清楚計(jì)劃的含義,百度百科里面是這樣解釋的: 在管理學(xué)中,計(jì)劃具有兩重含義,其一...
    樹(shù)皮醬閱讀 1,298評(píng)論 0 0

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