vue的雙向繫結和依賴收集

2022-07-04 10:48:10 字數 1941 閱讀 9240

在掘金上買了乙個關於解讀vue原始碼的小冊,因為是付費的,所以還比較放心

在小冊裡看到了關於vue雙向繫結和依賴收集的部分,總感覺有些怪怪的,然後就自己跟著敲了一遍。 敲完後,發現完全無法執行,  坑啊,  寫書人完全沒有測試過。

然後自己完善**, 越寫越發現坑, 問題有些大。。。。。。

最後自己重新實現了一遍,**較多。 用到觀察訂閱者模式實現依賴收集, object.defineproperty() 實現雙向繫結

/*

自己寫的**, 實現vue的雙向繫結和依賴收集

場景: 多個子元件用到父元件data中的資料, 當父元件data中的此資料發生改變時,

所有依賴它的 子元件全部更新

通常子元件的從父元件中拿取的資料不允許發生改變

*///

訂閱者 dep

//乙個訂閱者只管理乙個資料

class

dep

addsubs (sub)

notify () )}}

//監聽者

//乙個vue例項包含乙個watcher例項

class

watcher

update ()

}//對data中的資料設定讀寫監聽, 並且建立訂閱者, 用於收集子元件的依賴和發布

function definereactive (obj, key, value)

//return obj[key] 此寫法報錯 提示棧溢位 原因是無限呼叫get()

return

value

},set (newval) }})

}//接收乙個物件作為引數, 將該物件的所有屬性呼叫definereactive設定讀寫監聽

function observer (obj)

object.keys(obj).foreach( key =>)

}//建構函式, 監聽 配置options中的data()方法返回的物件的所有屬性 的讀寫

class

vue

//例項化該元件的子元件

this._children = options.render ? (options.render() ||{}) : {}}}

//父元件資料

let data =

let times = 0

//第一次呼叫返回的是第乙個子元件的從父元件繼承的資料(vue中props屬性的值)

//第二次呼叫返回的是第二個子元件的從父元件繼承的資料(vue中props屬性的值)

function getprops ()

object.keys(obj).foreach( key =>

else

})return

obj }

else

if (times == 2

) object.keys(obj).foreach( key =>

else

})return

obj }

}let vue_root = new

vue(,

props:

true

, render () {}

}) let vue_2 = new

vue(,

props:

true

, render () {}

}) return}})

console.log(vue_root)

vue_root._data.first = '

hello hello'//

vue_1 和 vue_2 都依賴此資料, 都更新

vue_root._data.third = "

aaa"

//只有 vue_2 依賴到了此資料, 更新

vue 單相繫結 Vue的單向繫結和雙向繫結

1 單向繫結 單向資料繫結的實現思路 所有資料只有乙份 一旦資料變化,就去更新頁面 只有data dom,沒有dom data 若使用者在頁面上做了更新,就手動收集 雙向繫結是自動收集 合併到原有的資料中。單項繫結 如下 html 2 雙向繫結 資料的雙向繫結是vue實現的一大功能。使用v mode...

Vue雙向繫結

把乙個普通物件 a 傳給 vue 例項作為它的 data 選項,vue.js 將遍歷它的屬性,用object.defineproperty 將它們轉為 getter setter,如圖綠色的部分所示。每次使用者更改data裡的資料的時候,比如a.b 1,setter就會重新通知watcher進行變動...

Vue 雙向繫結

在react或者vue這類mvvm框架中使用雙向繫結是很常見的需求,最近專案中在使用vue,今天來談一談vue中雙向繫結的實現。先來說幾句廢話 什麼是雙向繫結?把model中的資料繫結到view中,然後更新model時view會自動跟新,這叫單向繫結,而當使用者改變view時model中資料也能自動...