Vue 雙向繫結的原理及實現Demo

2021-07-27 16:56:24 字數 2723 閱讀 3393

vue用了一段時間了,一直沒有糾結過它的原理,今天看了一篇很不錯的文章:vue.js雙向繫結的實現原理,跟著敲了一遍,發現其中有意思的地方還是很多的,一些知識我之前都沒有接觸過,這裡要好好整理一下思路。

這篇部落格涉及的東西比較多,還需要慢慢整理。目前還未寫完。

主要的知識點:

1.vue雙向繫結原理(一)文件片段documentfragment

2.vue雙向繫結原理(二)訪問器屬性defineproperty()和發布/訂閱模式

大致思路: 首先vue會使用documentfragment劫持根元素裡包含的所有節點,這些節點不僅包括標籤元素,還包括文字,甚至換行的回車。

然後vue會把data中所有的資料,用defindproperty()變成vue的訪問器屬性,這樣每次修改這些資料的時候,就會觸發相應屬性的get,set方法。

接下來編譯處理劫持到的dom節點,遍歷所有節點,根據nodetype來判斷節點型別,根據節點本身的屬性(是否有v-model等屬性)或者文字節點的內容(是否符合}的格式)來判斷節點是否需要編譯。對v-model,繫結事件當輸入的時候,改變vue中的資料。對文字節點,將他作為乙個觀察者watcher放入觀察者列表,當vue資料改變的時候,會有乙個主題物件,對列表中的觀察者們發布改變的訊息,觀察者們再更新自己,改變節點中的顯示,從而達到雙向繫結的目的。

lang="en">

charset="utf-8">

雙向繫結demotitle>

body

style>

head>

type="text"

id="input"

v-model="text">

}div>

// vue建構函式

function

vue(options)

//遍歷傳入例項的data物件的屬性,將其設定為vue物件的訪問器屬性

function

observe

(obj,vm));

}//訪問器屬性是物件中的一種特殊屬性,它不能直接在物件中設定,而必須通過defineproperty()方法單獨定義。

//訪問器屬性的"值"比較特殊,讀取或設定訪問器屬性的值,實際上是呼叫其內部特性:get和set函式。

function

definereactive

(obj,key,val)

return val;

},set: function

(newval)

val = newval;

//給訂閱者列表中的watchers發出通知

dep.notify();

}});

}//主題物件dep建構函式

function

dep()

//dep有兩個方法,增加觀察者 和 發布訊息

dep.prototype = ,

notify: function

());}}

//documentfragment(文件片段)可以看作節點容器,它可以包含多個子節點,當我們將它插入到dom中時,只有它的子節點會插入目標節點,所以把它看作一組節點的容器。使用documentfragment處理節點,速度和效能遠遠優於直接操作dom。vue進行編譯時,就是將掛載目標的所有子節點劫持(真的是劫持)到documentfragment中,經過一番處理後,再將documentfragment整體返回插入掛載目標。

function

nodetofragment

(node,vm)

return flag;

}//編譯節點,初始化資料繫結

function

compile

(node,vm)}

var reg = /\\}/;

//節點型別為元素

if(node.nodetype === 1));

//改變之後,通過屬性名取得資料

node.value = vm.data[name];

//用完刪,所以瀏覽器中編譯之後的節點上沒有v-model屬性

node.removeattribute("v-model");}}

}//節點型別為text

if(node.nodetype === 3)}

if(reg.test(node.nodevalue))}

中的 文字【任意內容】

var name = regexp.$1;

//去掉前後空格,並將處理後的資料寫入節點

name = name.trim();

= vm.data[name];

//例項化乙個新的訂閱者watcher

new watcher(vm,node,name);

return;}}

}//觀察者建構函式。

//上邊例項化新的觀察者的時候執行這個函式:通過get()取得vue.data中對應的資料,然後通過update()方法把資料更新到節點中。

function

watcher

(vm,node,name)

// 觀察者使用update方法,實際上是

watcher.prototype = ,

//獲取data中的屬性值

get: function

() }

var vm = new vue(

})script>

body>

html>

vue雙向繫結原理及實現

資料雙向繫結原理簡單概括的話就是 view層影響model層是通過對 keyup 等事件的監聽。model層影響view層是通過object.defineproperty 方法劫持資料並結合發布訂閱者模式的方式來實現資料的雙向繫結。根據原理圖來介紹整個流程 1 首先使用object.definepr...

vue雙向繫結實現原理

當我們學會使用乙個東西的時候,就開始想要去知道這個東西是怎麼實現的,這個也是我們一直繼續 下去的動力,博主學了vue的時間也比較長了,自己也寫了乙個demo,還在不定時更新,有興趣的小夥伴可以去看看,如果這個專案能讓您有所收穫,那也是博主希望看到的,接下來也是聊聊自己開始學習vue一些實現原理的過程...

Vue雙向繫結原理及vue cli

vue.js介紹 1.vue.js的mvvm框架 2.什麼是vue.js vue.js是乙個輕量級的mvvm框架 中文官網 3.對比react angular vue.js更輕量級,gzip只有20k vue.js更容易上手,學習曲線平穩 吸取兩家之長,借鑑了angular的指令和react的指令化...