vue雙向繫結實現原理

2021-08-28 02:40:35 字數 1696 閱讀 8548

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

剛剛接觸vue的時候,我們就發現了這樣乙個有趣的功能,當我們在input輸入框輸入內容時,旁邊也會對應的顯示同樣內容

看起來似乎其實是個非常簡單的功能,但是vue背後實現卻比較複雜,博主也是查閱了很多資料,從中也是學習到了很多之前忽略的東西,vue的響應式原理首先就是利用了物件的訪問器屬性,就是setter/getter方法,並且利用es6的object.defineproperty()的方法就能去設定這個方法。

先來看下html部分的**

非常簡單的**,相信大家都能看懂,我們以上面的html頁面為例,一步一步來解析vue響應式原理的實現步驟

function definereactive (obj, key, val) ,

set: function (newvalue)

})} function observe (obj, vm) )

} function nodetofragment (node, vm)

// 18.node子節點遍歷完成,退出迴圈,返回dom片段

return flag;

} function compile (node, vm) \}/;

//節點型別為元素

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

// 6.把例項中data物件對應上面的name屬性的值賦值給子節點的value值,觸發訪問器get

// 注意此時的dep.target還是undefined

node.value = vm[name]

node.removeattribute('v-model')}}

}//節點型別為文字

if (node.nodetype === 3)

}} function watcher (vm, node, name)

watcher.prototype = ,

get: function ()

} function dep ()

dep.prototype = ,

// 22.執行儲存在subs陣列中的watcher觀察者的update方法

notify: function () )

}} function vue (options)

var vm = new vue(

})

博主也是將詳細的步驟也是寫在了注釋上面,如果有的同學不理解的話,可以利用chrome瀏覽器的斷點除錯功能來檢視**的執行步驟,此外這裡也是應用到了一種叫做發布訂閱的模式,博主也是採用了設計模式一書中的概括

乙個或多個觀察者對目標的狀態感興趣,它們通過將自己依附在目標物件上一邊註冊所感興趣的內容,目標狀態發生改變並且觀察者可能對這些改變感興趣,就會傳送乙個通知訊息,呼叫每個觀察者的更新方法。當觀察者不再對目標狀態感興趣時,它們可以簡單地將自己從中分離。

看到這個定義是不是對於上面的**有了一些認識的呢,正是利用了這種模式來實現乙個簡單的vue響應式原理,就是這樣簡單的**其中包含的東西也是非常多,需要有很多知識的鋪墊才能理解,所以前路很長,還有很多等待我們去學習。

vue實現資料雙向繫結原理

vue實現資料雙向繫結主要是採用資料劫持結合發布者 訂閱者的模式的方式來實現。通過object.defineproperty 的get和set來劫持每個屬性,在資料發生變化時通過發布者發訊息給訂閱者,觸發相應的監聽回掉。具體就是先把說有的資料做乙個資料劫持。第一先修改資料,在input框輸入值的時候...

vue雙向繫結原理及實現

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

vue雙向繫結原理

大家知道vue的雙向繫結原理是利用object.defineproperty 這一方法,以下是我研究該方法的一些內容 語法 object.defineproperty obj,prop,descriptor descriptor是將被定義或修改的屬性描述符,而雙向繫結是利用get和set屬性描述符。...