不要認為資料發生改變,介面跟著更新,是理所當然的
其實並不是理所當然的,內部其實做了很多封裝
>
}<
/div>
"./node_modules/vue/dist/vue.js"
>
<
/script>
newvue(}
)<
/script>
<
/body>
2.當資料發生改變,vue是如何知道要通知哪些人介面發生更新?
發布訂閱者模式
newvue(}
)把data
物件傳到了vue
內部,一旦傳進去,內部會做下面這個事情
const obj =
object.
keys
(obj)
.foreach
(key=>
,get()
})})
內部拿到乙個obj
的物件,進行遍歷,拿到每乙個key
對應的值,現在要監聽值的改變?用object.defineproperty
來監聽,給obj物件定義乙個key的屬性,obj原來的屬性不好監聽,所以來重新定義。
現在要告訴別人,誰來用監聽到的東西。誰用就告訴誰,那我們怎麼知道誰在用呢?根據解析html**獲取到哪些人有用屬性,獲取值的時候會呼叫get
,一旦我發現value發生改變,就通知呼叫get的人。就是發布者訂閱者模式,也就是讓呼叫get的人訂閱屬性的改變。
>
}//張三
}//李四
}//王五
}<
/div>
//發布者
class
dependency
//加進去要訂閱的人,通知他們之後,他們會更新
addsub
(watcher)
//值發生改變了,拿到所有的訂閱者,就通知更新
notify()
)}}//訂閱者
class
watcher
update()
}//呼叫constructor
const dep=
newdependency()
//誰呼叫了get 就建立watcher
const watcher1=
newwatcher
('張三'
) dep.
addsub
(watcher1)
dep.
notify
()
把多個訂閱者物件新增進發布者,發布者只要呼叫了`notify()``,立馬通知所有的訂閱者,讓他更新自己的update,更新自己的介面。
observer
做的事情就是object.defineproperty
,對屬性進行劫持,拿到object.key
,每乙個屬性都需要劫持,乙個屬性就對應建立乙個dep物件,
name -> dep物件 -> subs -> [watcher1,watcher2]
vue響應式布局 Vue 響應式原理
vue2 的資料偵測 在 src observer 目錄裡面,元件例項在初始化時,會呼叫 observe 函式處理 data function initdata vm observe 改寫了所有物件屬性的 getter setter 和陣列原型上的 7 個會改寫陣列方法,從而讓 data 變成可響應...
vue響應式原理
響應式系統是vue框架核心的部分,資料物件僅僅是普通的 js物件。當我們改變資料時,檢視也會被改變,本文就來 一下vue 的響應式原理。vue響應式的核心是使用了es5 新增的api object.defineproperty 因此vue不支援ie8 object.defineproperty的作用...
vue響應式原理
要了解響應式原理首先應該知道什麼是響應式 更改 vue的響應式原理是什麼 vue資料的雙向繫結是通過資料劫持結合發布訂閱模式,偵測到資料變化,然後通過object.defineproperty 物件對每個屬性的getter和setter進行劫持。當讀取 data 中的資料時自動呼叫 get 方法,當...