Vue響應式原理Observer

2021-10-21 23:46:05 字數 2224 閱讀 4322

元件初始化時會執行initstate方法,主要是對 props、methods、data、computed、watcher 等屬性做了初始化操作。這裡我們分析 data

export function initstate (vm: component)  else , true /* asrootdata */)

} if (opts.computed) initcomputed(vm, opts.computed)

if (opts.watch && opts.watch !== nativewatch)

}

function initdata (vm: component) 

if (!isplainobject(data))

process.env.node_env !== 'production' && warn(

'data functions should return an object:\n' +

'',vm

)} // proxy data on instance

const keys = object.keys(data)

const props = vm.$options.props

const methods = vm.$options.methods

let i = keys.length

while (i--) " has already been defined as a data property.`,vm)

}}

if (props && hasown(props, key)) " is already declared as a prop. ` +

`use prop default value instead.`,vm)

} else if (!isreserved(key))

} // observe data

observe(data, true /* asrootdata */)

}

initdata主要做了兩件事:

1、呼叫了proxy  把data的資料****vue例項上。

2、呼叫observer把資料變成響應式。我們重點分析observer

export function observe (value: any, asrootdata: ?boolean): observer | void
export class observer  else 

} walk (obj: object)

}}

observer主要做了三件事:

1、給物件新增乙個__ob__的屬性;

2、給物件新增乙個dep 依賴收集器;

3、迴圈物件,呼叫definereactive,給物件每個屬性值新增響應式

export const definereactive = (

obj: object,

key: string,

val: any,

customsetter?: function,

shallow?: boolean

) =>

}return val

},set(newval) }})

}

definereactive給物件的屬性實現響應式:

1、給物件的屬性建立乙個dep依賴收集器

2、執行observer(val),因為可能是巢狀物件

3、定義get方法,當物件的該屬性被訪問時,執行dep.depend收集器dep會收集watcher物件(觀察者)。那什麼時候會執行get方法,watcher物件又是誰呢?

4、定義set方法,當資料發生改變時,執行dep.notify派發通知,get方法收集的watcher接到通知後執行對應的操作,如果是渲染watcher則執行更新dom的操作。新的資料可能也是個物件·,所以需要執行observer(newval),給新值新增響應式

5、大家可能有個疑問,childob.dep.depend()這裡的作用。childob是乙個observer物件,我們上面分析observer的時候,observer物件裡也有乙個dep收集器,observer會執行this.dep=new dep(),並且迴圈物件呼叫definereative。definereative已經給物件的屬性新增了dep,那observer物件裡的this.dep有什麼用呢

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 方法,當...