當我們學會使用乙個東西的時候,就開始想要去知道這個東西是怎麼實現的,這個也是我們一直繼續**下去的動力,博主學了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屬性描述符。...