所有的 prop 都使得其父子 prop 之間形成了一個(gè)單向下行綁定:父級(jí) prop 的更新會(huì)向下流動(dòng)到子組件中呀忧,但是反過來則不行。這樣會(huì)防止從子組件意外變更父級(jí)組件的狀態(tài)溃睹,從而導(dǎo)致你的應(yīng)用的數(shù)據(jù)流向難以理解而账。
額外的,每次父級(jí)組件發(fā)生變更時(shí)因篇,子組件中所有的 prop 都將會(huì)刷新為最新的值泞辐。這意味著你不應(yīng)該在一個(gè)子組件內(nèi)部改變 prop。如果你這樣做了竞滓,Vue 會(huì)在瀏覽器的控制臺(tái)中發(fā)出警告咐吼。
如果修改了,Vue 是如何監(jiān)控到屬性的修改并給出警告的商佑。
在initProps的時(shí)候锯茄,在defineReactive時(shí)通過判斷是否在開發(fā)環(huán)境,如果是開發(fā)環(huán)境茶没,會(huì)在觸發(fā)set的時(shí)候判斷是否此key是否處于updatingChildren中被修改肌幽,如果不是,說明此修改來自子組件抓半,觸發(fā)warning提示喂急。
需要特別注意的是,當(dāng)你從子組件修改的prop屬于基礎(chǔ)類型時(shí)會(huì)觸發(fā)提示笛求。 這種情況下廊移,你是無法修改父組件的數(shù)據(jù)源的糕簿, 因?yàn)榛A(chǔ)類型賦值時(shí)是值拷貝。你直接將另一個(gè)非基礎(chǔ)類型(Object, array)賦值到此key時(shí)也會(huì)觸發(fā)提示(但實(shí)際上不會(huì)影響父組件的數(shù)據(jù)源)狡孔, 當(dāng)你修改object的屬性時(shí)不會(huì)觸發(fā)提示懂诗,并且會(huì)修改父組件數(shù)據(jù)源的數(shù)據(jù)。