props down, events up
父組件通過 props 向下傳遞數據給子組件;子組件通過 events 給父組件發送消息。
靜態 props
要讓子組件使用父組件的數據,需要通過子組件的 props 選項。給 childNode 添加一個 props 選項和需要的forChildMsg數據;
var
childNode = {
template: `
<div>
{{forChildMsg}}
</div>
`,
props: [
"for-child-msg"
]
};
props 聲明的屬性,在父組件的 template 模板代表子組件的地方,屬性名需要使用中划線寫法;
子組件 props 屬性聲明時,使用小駝峰或者中划線寫法都可以;而子組件的模板使用從父組件傳來的變量時,需要使用對應的小駝峰寫法
動態 props
在模板中,要動態地綁定父組件的數據到子組件模板的 props,和綁定 Html 標簽特性一樣,在父組件的template模板里使用v-bind綁定;
<child :
for
-child-msg=
"childMsg2"
></child>
props 驗證
驗證傳入的 props 參數的數據規格,如果不符合數據規格,Vue 會發出警告。
Vue.component(
"example"
, {
props: {
// 基礎類型檢測, null意味着任何類型都行
propA: Number,
// 多種類型
propB: [String, Number],
還可以在 props 定義的數據中加入自定義驗證函數,當函數返回 false 時,輸出警告。該函數命名是規定叫validator,自定義函數名不會生效。
props: {
"for-child-msg"
: {
validator:
function
(value) {
return
value > 100;
}
}
}
單向數據流
props 是單向綁定的:當父組件的屬性變化時,將傳導給子組件,但是不會反過來。
修改 props 數據
定義一個局部變量,並用 prop 的值初始化它。但是由於定義的 ownChildMsg 只能接受 forChildMsg 的初始值,當父組件要傳遞的值變化發生時,ownChildMsg 無法收到更新。
更加妥帖的方式是使用變量存儲 prop 的初始值,並用 watch 來觀察 prop 值得變化。發生變化時,更新變量的值。
data() {
return
{
ownChildMsg:
this
.forChildMsg
};
},
watch: {
forChildMsg() {
this
.ownChildMsg =
this
.forChildMsg;
}
}
對於絕大多數特性來說,從外部提供給組件的值會替換掉組件內部設置好的值。所以如果傳入
type="text"
就會替換掉
type="date"
並把它破壞!慶幸的是,
class
和
style
特性會稍微智能一些,即兩邊的值會被合並起來,從而得到最終的值。
如果你不希望組件的根元素繼承特性,你可以在組件的選項中設置 inheritAttrs: false
。