在Vue中,父子組件的關(guān)系可以總結(jié)為,父組件通過prop向下傳遞,給子組件發(fā)數(shù)據(jù),子組件通過事件給父組件發(fā)送消息。
組件實例的作用域是孤立的。這意味著不能 (也不應(yīng)該) 在子組件的模板內(nèi)直接引用父組件的數(shù)據(jù)。父組件的數(shù)據(jù)需要通過?prop?才能下發(fā)到子組件中。
eg://父組件
newVue({
el:'#prop-example-2',?
data: {????????????
????????parentMsg:'Message from parent'?
????}
});
子組件中:<div>{{parentMsg}}<div/>
newVue({
el:'#prop-example-2',
? data: { },
????props:['我是子組件']
});
單向數(shù)據(jù)流:Prop 是單向綁定的:當(dāng)父組件的屬性變化時,將傳導(dǎo)給子組件,但是反過來不會。這是為了防止子組件無意間修改了父組件的狀態(tài),來避免應(yīng)用的數(shù)據(jù)流變得難以理解。另外,每次父組件更新時,子組件的所有 prop 都會更新為最新值。這意味著你不應(yīng)該在子組件內(nèi)部改變 prop。如果你這么做了,Vue 會在控制臺給出警告。
在兩種情況下,我們很容易忍不住想去修改 prop 中數(shù)據(jù):
Prop 作為初始值傳入后,子組件想把它當(dāng)作局部數(shù)據(jù)來用;
Prop 作為原始數(shù)據(jù)傳入,由子組件處理成其它數(shù)據(jù)輸出。
對這兩種情況,正確的應(yīng)對方式是:
定義一個局部變量,并用 prop 的值初始化它:
props: ['initialCounter'],
data:function(){
????????return{counter:this.initialCounter }
}
定義一個計算屬性,處理 prop 的值并返回:
props: ['size'],
computed: {
????????normalizedSize:function(){
????????????returnthis.size.trim().toLowerCase()
????? }
};
注意在 JavaScript 中對象和數(shù)組是引用類型,指向同一個內(nèi)存空間,如果 prop 是一個對象或數(shù)組,在子組件內(nèi)部改變它會影響父組件的狀態(tài)。