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