1. 程式人生 > >vue三要素及底層實現機制

vue三要素及底層實現機制

深入解析Vue

我們首先來熟悉一下我們這個文件所學習內容的流程。

 

先對比一下jQueryVue的區別,再講述VueMVVM模型,接著講解Vue的實現流程。

 

當然,我是不相信沒有對比哪來的傷害,沒有傷害哪能讓人記憶深入骨髓咧,向來都是被傷害過的人我才會記得你,我要恨你一輩子 ~ ~ 哈哈,這當然是個泛詞,我們今天的重點也不是要你真的去恨誰哈,一起來看今日焦點,jQuery Vue的生死之戰。

 

我們來看看jQuery Vue 分別具有什麼奪命技能,來來來,看官們看好了。

一、jQueryVue的區別

 

資料和檢視分離,解耦(就是都單獨分開來)

以資料驅動檢視,只關心資料變化,DOM被封裝

jQuery:中規中矩的JS門派的後生, 主要的技能就是操作DOM來更改資料,和用DOM來變化資料和檢視的更新,

Vue: 獨樹一派, 擁有響應式,模板引擎解析器,和渲染機制必殺技。

 

 

二、VueMVVM模型

VueMVVM模型講的是M-> model(資料模型),V-> view(檢視、模板),VM-> ViewModelVMMV之間的橋樑,如果沒有VM的話,那麼Vue就無法實現資料驅動檢視進行更新的操作了,

首先我們來介紹一下三者在Vue 裡面的表現形式:

三者之間的繫結方式是:

ViewViewModel這個橋樑上利用DOM-listener事件繫結監聽事件,將DOM節點上發生的事件傳給model

ModelViewModel這個橋樑上利用Data-bindings資料繫結事件,將Model資料發生改變的事件傳給View

這樣就實現了檢視層和資料層雙向資料繫結。

 

下面用一個圖來解釋一下三者相對應一個Vue 程式碼中的對應的部分:

 

 

 

三、MVVM框架的三要素

1、響應式 vue如何監聽到data的每個屬性變化?

利用Object.defineProperty定義屬性,第一個引數物件,第二個屬性名

 

 

data裡面的屬性代理到vm

利用Object.defineProperty

 

console.log(obj.name); // 可以監聽到
obj.name = 'lisi'; // 可以監聽到

使用defineProperty我們就可以監聽到資料變化了。其中這個也是 vue 做響應工做核心的方法了。
下面我們來模擬一下
var mv = {}

var data = {
  price: 100, name: 'zhangsan' } var key, value; for (key in data) { // 命中閉包。新建一個函式,保證 key 的獨立的作用域 (function (key) { Object.defineProperty(mv, key, { get: function () { console.log('get'); return data[key]; }, set: function (newVal) { console.log('set'); data[key] = newVal } }) })(key); }
 

2、模板解析: vue的模板如何被解析,指令如何處理?

1) vue裡面為什麼要解析模板?

  1. 這個模板本質是字串,
  2. 但它和html很像但有很大區別,
  3. 是在這個模板裡的html有邏輯,v-for, v-if等等,
  4. 最終必須解析成html來顯示,
  5. 模板最終必須轉換成 JS 程式碼, 因為:

 

    • 有邏輯(v-if v-for),必須用 JS 才能實現( 圖靈完備)
    • 轉換為 html 渲染頁面,必須用 JS 才能實現
    • 因此,模板最重要轉換成一個 JS 函式

 

因為只有JS才能實現將程式碼轉化成html格式渲染到瀏覽器上

for example: 

 <div id="app"> <div> <input v-model="title"> <button v-on:click="add">submit</button> </div> <ul> <li v-for="item in list">{{item}}</li> </ul> </div>

 以上就是一個模板啦

 

2) render函式

with 用法(vue render有用到,所以說下用法 ,具體開發中建議不使用)

簡要說明

with 語句可以方便地用來引用某個特定物件中已有的屬性,但是不能用來給物件新增屬性。要給物件建立新的屬性,必須明確地引用該物件。

render 函式

基礎事例

VUE一般使用template來建立HTML,然後在有的時候,我們需要使用javascript來建立html,這時候我們需要使用render函式。
比如如下我想要實現如下html:

 

 

我們來嘗試使用 render函式重寫上面的demo,如下:

  1. 模板中所有資訊都包含在了 render 函式中
  2. this 即 vm
  3. price 即 this.price 即 vm.price, 即 data 中的 price
  4. _c 即 this._c 即 vm._c

 

通過控制檯列印,我們就知道了 _c就是一個建立dom 元素的方法, _v 是一個創節點的方法, _s 是 toString 方法。

 

3、渲染:  vue的模板如何被渲染成html? 以及渲染過程?

 

四、Vue的實現流程

1、首先模板解析器解析成render函式

2、響應式監聽

3、將資料渲染進模板裡,

4、data屬性變化,觸發render

 

 jQuery:“  您能別秀了嗎  ”