手動實現vue資料雙向繫結

2021-10-03 07:39:50 字數 2395 閱讀 5656

1.看了vue 資料雙向繫結的原始碼決定 根據自己的理解 實現乙個簡單版的 vue雙向繫結

class

vue}

class

vue;

//對data 屬性進行初始化

this

.dep =

newdep()

;// 初始化訂閱列表

this

.observer

(this

.$data)

;//將data 物件傳入 觀察者方法 內進行 屬性劫持

}//觀察者

observer

(data)

,set

:function

(newval)})

}}}// 訂閱列表

class

dep//觸發 發布資訊

noify

(key))}

}

class

vue;

//對data 屬性進行初始化

this

.dep =

newdep()

;// 初始化訂閱列表

this

.observer

(this

.$data)

;//將data 物件傳入 觀察者方法 內進行 屬性劫持

}//觀察者

observer

(data)

,set

:function

(newval)})

}}}// 訂閱列表

class

dep//觸發 發布資訊

noify

(key))}

}//為了看起來方便 將上述** 一起 copy 下來並做稍微的更改

//***

class

watcher

update()

}

class

vue;

//對data 屬性進行初始化

this

.$el = document.

queryselector

(options.el)

;// 此處只考慮傳入 el 屬性的vue例項 template 不考慮(過於麻煩) 根據傳入的el 屬性值選擇出掛載節點

this

.dep =

newdep()

;// 初始化訂閱列表

this

.observer

(this

.$data)

;//將data 物件傳入 觀察者方法 內進行 屬性劫持

this

.complie

(this

.$el)

;// 解析

}//觀察者

observer

(data)

,set

:function

(newval)})

}}//解析器 (收集依賴)

complie

(el)

//找到對應的訂閱者列表 新增監聽者例項(訂閱者)

vm.dep[exp]

.push

(new

watcher

(vm,element,

function()

))}//同理 對 v-text 指令進行處理

if(element.

hasattribute

('v-text'))

))}// 如果當前元素還有子元素 那麼進行遞迴 解析

if(element.children && element.children.length)}}

}// 訂閱列表

class

dep//觸發 發布資訊

noify

(key))}

}//為了看起來方便 將上述** 一起 copy 下來並做稍微的更改

//***

class

watcher

update()

}

//html

>

this is vue 2.x<

/h3>

"text" v-model=

"inputvalue"

/>

"inputvalue"

>

<

/p>

<

/div>

//js

newvue(}

)//效果實現

vue 資料雙向繫結實現

之前每件事都差不多,直到現在才發現差很多。現在才發現理清一件事的原委是多麼快樂的一件事,我們共同勉勵。紙上得來終覺淺,絕知此事要躬行 懶得扯淡,直接正題 ps 文章略長。model view編譯器 其基於 訂閱者 發布者模式,簡單的講就是訂閱者訂閱資料,一旦訂閱的資料變更過後,更新繫結的view檢視...

vue實現雙向資料繫結

object.defineproperty 方法會直接在乙個物件上定義乙個新屬性,或者修改乙個物件的現有屬性,並返回這個物件。object.defineproperty 方法有三個引數 引數 功能 作用 obj 要修改或定義key值的物件 key 對應obj物件的裡面某有已有或要修改的屬性 opti...

Vue如何實現資料雙向繫結

說明 index.html lang en head p p v text msg p v text car.color p v html msg p v html car.color p type text v model msg v on click clickfn 點我button div...