const data =reactive({
msg:'Hello World',})newWatcher(()=>{
document.getElementById('app').innerHTML =`msg is ${
data.msg}`})
reactive
深度遍历 data,为每个属性添加 getter/setter
访问属性时,订阅、返回值。设置属性时,修改值、通知。
import Dep from'./dep'import{
isObject }from'./utils'// 将对象定义为响应式exportdefaultfunction reactive<Textendsobject>(data:T):T{
if(isObject(data)){
Object.keys(data).forEach(key =>{
defineReactive(data, key as keyof T)})}return data
}function defineReactive<Textendsobject,KextendskeyofT>(data:T, key:K):void{
let val = data[key]const dep =newDep()
Object.defineProperty(data, key,{
get(){
dep.depend()return val
},set(newVal){
val = newVal
dep.notify()}})if(isObject(val)){
reactive(val)}}