您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 >
01 vue觀察者模式和訂閱模式(vuejs源碼用了什么設計模式,具體點的)
Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-07-08 08:46:15【】5人已围观
简介vuejs源碼用了什么設計模式,具體點的最簡單的訂閱者模式//ObserverclassObserver{買粉絲nstructor(data){this.walk(data)}walk(data){/
vuejs源碼用了什么設計模式,具體點的
最簡單的訂閱者模式
// Observer
class Observer {
買粉絲nstructor (data) {
this.walk(data)
}
walk (data) {
// 遍歷
let keys = Object.keys(data)
for(let i = 0; i < keys.length; i++){
defineReactive(data, keys[i], data[keys[i]])
}
}
}
function defineReactive (data, key, val) {
observer(val)
// dep 為什么要在這里實例化, 就是為了實現, 對象每一層的 每一個key都有自己的一個訂閱實例, 比如 a.b 對應 dep1, a.c 對應dep2, 這里雖然都是let dep = new Dep()
// 但每次來到這個方法, dep都是獨立的, 會一直保留在內存. 這樣在每次調用set方法都能找到這個a.b對應的dep
// dep 這里會一直保存, 是因為閉包的關系, Object這個全局的函數, 引用了上層的作用域, 這個作用域包含了 dep, 除非Object = null, 或者退出瀏覽器, dep才會消失
//實例化之后, dep就有了被訂閱, 和發布消息的功能, dep不寫在這里也是可以的, 多定義一個全局函數, 每次obser的時候增加一個dep
let dep = new Dep()
Object.defineProperty(data, key, {
enumerable: true,
買粉絲nfigurable: true,
get: function () {
//每次new Watch('a.b'), 都會先執行get方法, 進而來到這里, 觸發 dep.depend(), 這個dep就是 a.b 對應的 訂閱,
dep.depend()
return val
},
set: function (newVal) {
if(val === newVal){
return
理解VUE2雙向數據綁定原理和實現
1.vue 雙向數據綁定是通過 數據劫持 結合 發布訂閱模式的方式來實現的, 也就是說數據和視圖同步,數據發生變化,視圖跟著變化,視圖變化,數據也隨之發生改變;
2.核心:關于VUE雙向數據綁定,其核心是 Object.defineProperty()方法;
3.介紹一下Object.defineProperty()方法
(1)Object.defineProperty(obj, prop, descriptor) ,這個語法內有三個參數,分別為 obj (要定義其上屬性的對象) prop (要定義或修改的屬性) descriptor (具體的改變方法)
(2)簡單地說,就是用這個方法來定義一個值。當調用時我們使用了它里面的get方法,當我們給這個屬性賦值時,又用到了它里面的set方法;
這樣我們就能實現js的雙向數據綁定,也對這個方法有初步的了解 ;
這個例子實現的效果是:隨著文本框輸入文字的變化,span中會同步顯示相同的文字內容;這樣就實現了 model => view 以及 view => model 的雙向綁定。
通過添加事件監聽keyup來觸發set方法,而set再修改了訪問器屬性的同時,也修改了dom樣式,改變了span標簽內的文本。
1.實現效果
先來看一下vue雙向數據綁定是如何進行的,以便我們確定好思考方向
2.任務拆分
拆分任務可以讓我們的思路更加清晰:
(1)將vue中的data中的內容綁定到輸入文本框和文本節點中
(2)當文本框的內容改變時,vue實例中的data也同時發生改變
(3)當data中的內容發生改變時,輸入框及文本節點的內容也發生變化
3.開始任務1——綁定內容
我們先了解一下 DocuemntFragment(碎片化文檔) 這個概念,你可以把他認為一個dom節點收容器,當你創造了10個節點,當每個節點都插入到文檔當中都會引發一次瀏覽器的回流,也就是說瀏覽器要回流10次,十分消耗資源。
而使用碎片化文檔,也就是說我把10個節點都先放入到一個容器當中,最后我再把容器直接插入到文檔就可以了!瀏覽器只回流了1次。
注意:還有一個很重要的特性是,如果使用appendChid方法將原dom樹中的節點添加到DocumentFragment中時,會刪除原來的節點。
舉個例子:
可以看到,我的app中有兩個子節點,一個元素節點,一個文本節點
但是,當我通過DocumentFragment 劫持數據一下后
注意:我的碎片化文檔是將子節點都劫持了過來,而我的id為app的div內已經沒有內容了。
同時要主要我while的判斷條件。判斷是否有子節點,因為我每次appendChild都把node中的第一個子節點劫持走了,node中就會少一個,直到沒有的時候,child也就變成了undefined,也就終止了循環。
來實現內容綁定
我們要考慮兩個問題,一個是如何綁定要input上,另一個是如何綁定要文本節點中。
這樣思路就來了,我們已經獲取到了div的所以子節點了,就在DocumentFragment里面,然后對每一個節點進行處理,看是不是有跟vm實例中有關聯的內容,如果有,修改這個節點的內容。然后重新添加入DocumentFragment中。
首先,我們寫一個處理每一個節點的函數,如果有input綁定v-model屬性或者有{ { xxx }}的文本節點出現,就進行內容替換,替換為vm實例中的data中的內容
然后,在向碎片化文檔中添加節點時,每個節點都處理一下。
創建Vue的實例化函數
效果圖如下:
我們成功將內容都綁定到了輸入框與文本節點上!
4、實現任務2——【view => model
對于此任務,我們從輸入框考慮,輸入框的問題,輸入框如何改變data。我們通過事件監聽器keyup,input等,來獲取到最新的value,然后通過Object.defineProperty將獲取的最新的value,賦值給實例vm的text,我們把vm實例中的data下的text通過Object.defineProperty設置為訪問器屬性,這樣給vm.text賦值,就觸發了set。set函數的作用一個是更新data中的text,另一個等到任務三再說。
首先實現一個響應式監聽屬性的函數。一旦有賦新值就發生變化
然后,實現一個觀察者,對于一個實例 每一個屬性值都進行觀察。
改寫編譯函數,注意由于改成了訪問器屬性,訪問的方法也產生變化,同時添加了事件監聽器,把實例的text值隨時更新
實例函數中,觀察data中的所有屬性值,注意增添了observe
最終我們改變input中的內容能改變data中的數據,單頁面卻沒有刷新
4、實現任務3——【model => view】
通過修改vm實例的屬性 該改變輸入框的內容 與 文本節點的內容。
這里涉及到一個問題 需要我們注意,當我們修改輸入框,改變了vm實例的屬性,這是1對1的。
但是,我們可能在頁面中多處用到 data中的屬性,這是1對多的。也就是說,改變1個model的值可以改變多個view中的值。
這就需要我們引入一個新的知識點:
訂閱/發布者模式
訂閱發布模式(又稱觀察者模式)定義了一種一對多的關系,讓多個觀察者同時監聽某一個主題對象,這個主題對象的狀態發生改變時就會通知所有觀察者對象。
發布者發出通知 => 主題對象收到通知并推送給訂閱者 => 訂閱者執行相應操作
1
舉個例子:
之前提到的set函數的第二個作用 就是來提醒訂閱者 進行noticy操作,告訴他們:“我的text變了!” 文本節點變成了訂閱者,接到消息后,立馬進行update操作
很赞哦!(97)
相关文章
- 01 上海稱呼外婆叫什么(上海都叫姥姥。這說明上海都是好人。因為姥姥是性別平等的尊稱?)
- 01 上海確佳貿易有限公司 招聘(國際貿易專業好不好)
- 01 上海確佳貿易有限公司待遇怎么樣(食品科學就業)
- 01 上海祥水貿易有限公司怎么樣啊(國際貿易公司起名大全)
- 01 上海福山外國語小學福山校區郵編(上海福山外國語小學在哪里)
- 01 03 粉絲買單是歪理嗎(30句幽默的精辟語句摘抄)
- 01 上海站和上海虹橋站哪個到外灘近(上海虹橋和上海站哪個離外灘近)
- 01 上海益牧國際貿易有限公司(石藥集團恩必普藥業有限公司是國企嗎)
- 01 03 粉絲買單的段子(費玉清上節目的時候經常“開車”為何卻沒人反感?)
- 01 04 帶著粉絲去買貓咪(貓女孩的愛情:我的男朋友是領養貓咪送的,還能領嗎?)
热门文章
站长推荐
01 04 帶粉絲去買奔馳a(國產奔馳AMG,價格下探至40萬,值不值得購買?)
01 04 帶粉絲4s買車(網上很多的車評人,都會幫粉絲低價買車,他們是在作秀嗎?)
01 上海稱呼外婆叫什么(上海人怎么稱呼外公外婆?)
01 上海福合貿易有限公司(《突圍》福記公司原型是什么?)
01 上海第一人民醫院神經外科專家門診(上海哪家醫院看腦垂體瘤比較權威)
01 03 粉絲心酸的買鞋之旅(開學第一天,安徽阜陽一名小學生穿只有腳后跟的鞋上學,這名學生的家庭狀況讓人感覺到心酸,該如何幫助他)
01 03 替粉絲買貓博主(博主伽妃貓是干什么的)
01 03 粉絲問我買什么車(每天研究車的汽車媒體人們,自己都買的什么車?)