Vue組件選項(xiàng)props實(shí)例詳解
前面的話
組件接受的選項(xiàng)大部分與Vue實(shí)例一樣,而選項(xiàng)props是組件中非常重要的一個(gè)選項(xiàng)。在 Vue 中,父子組件的關(guān)系可以總結(jié)為 props down, events up。父組件通過 props 向下傳遞數(shù)據(jù)給子組件,子組件通過 events 給父組件發(fā)送消息。本文將詳細(xì)介紹Vue組件選項(xiàng)props

靜態(tài)props
組件實(shí)例的作用域是孤立的。這意味著不能 (也不應(yīng)該) 在子組件的模板內(nèi)直接引用父組件的數(shù)據(jù)。要讓子組件使用父組件的數(shù)據(jù),需要通過子組件的 props 選項(xiàng)
使用Prop傳遞數(shù)據(jù)包括靜態(tài)和動態(tài)兩種形式,下面先介紹靜態(tài)props
子組件要顯式地用 props 選項(xiàng)聲明它期待獲得的數(shù)據(jù)
var childNode = {
template: '<div>{{message}}</div>',
props:['message']
}
靜態(tài)Prop通過為子組件在父組件中的占位符添加特性的方式來達(dá)到傳值的目的
<div id="example">
<parent></parent>
</div>
<script>
var childNode = {
template: '<div>{{message}}</div>',
props:['message']
}
var parentNode = {
template: `
<div class="parent">
<child message="aaa"></child>
<child message="bbb"></child>
</div>`,
components: {
'child': childNode
}
};
// 創(chuàng)建根實(shí)例
new Vue({
el: '#example',
components: {
'parent': parentNode
}
})
</script>

命名約定
對于props聲明的屬性來說,在父級HTML模板中,屬性名需要使用中劃線寫法
var parentNode = {
template: `
<div class="parent">
<child my-message="aaa"></child>
<child my-message="bbb"></child>
</div>`,
components: {
'child': childNode
}
};
子級props屬性聲明時(shí),使用小駝峰或者中劃線寫法都可以;而子級模板使用從父級傳來的變量時(shí),需要使用對應(yīng)的小駝峰寫法
var childNode = {
template: '<div>{{myMessage}}</div>',
props:['myMessage']
}
var childNode = {
template: '<div>{{myMessage}}</div>',
props:['my-message']
}
動態(tài)props
在模板中,要動態(tài)地綁定父組件的數(shù)據(jù)到子模板的 props,與綁定到任何普通的HTML特性相類似,就是用 v-bind。每當(dāng)父組件的數(shù)據(jù)變化時(shí),該變化也會傳導(dǎo)給子組件
var childNode = {
template: '<div>{{myMessage}}</div>',
props:['myMessage']
}
var parentNode = {
template: `
<div class="parent">
<child :my-message="data1"></child>
<child :my-message="data2"></child>
</div>`,
components: {
'child': childNode
},
data(){
return {
'data1':'aaa',
'data2':'bbb'
}
}
};
傳遞數(shù)字
初學(xué)者常犯的一個(gè)錯誤是使用字面量語法傳遞數(shù)值
<!-- 傳遞了一個(gè)字符串 "1" -->
<comp some-prop="1"></comp>
<div id="example">
<my-parent></my-parent>
</div>
<script>
var childNode = {
template: '<div>{{myMessage}}的類型是{{type}}</div>',
props:['myMessage'],
computed:{
type(){
return typeof this.myMessage
}
}
}
var parentNode = {
template: `
<div class="parent">
<my-child my-message="1"></my-child>
</div>`,
components: {
'myChild': childNode
}
};
// 創(chuàng)建根實(shí)例
new Vue({
el: '#example',
components: {
'MyParent': parentNode
}
})
</script>

因?yàn)樗且粋€(gè)字面 prop,它的值是字符串 "1" 而不是 number。如果想傳遞一個(gè)實(shí)際的 number,需要使用 v-bind,從而讓它的值被當(dāng)作JS表達(dá)式計(jì)算
<!-- 傳遞實(shí)際的 number -->
<comp v-bind:some-prop="1"></comp>
var parentNode = {
template: `
<div class="parent">
<my-child :my-message="1"></my-child>
</div>`,
components: {
'myChild': childNode
}
};

或者可以使用動態(tài)props,在data屬性中設(shè)置對應(yīng)的數(shù)字1
var parentNode = {
template: `
<div class="parent">
<my-child :my-message="data"></my-child>
</div>`,
components: {
'myChild': childNode
},
data(){
return {
'data': 1
}
}
};
props驗(yàn)證
可以為組件的 props 指定驗(yàn)證規(guī)格。如果傳入的數(shù)據(jù)不符合規(guī)格,Vue會發(fā)出警告。當(dāng)組件給其他人使用時(shí),這很有用
要指定驗(yàn)證規(guī)格,需要用對象的形式,而不能用字符串?dāng)?shù)組
Vue.component('example', {
props: {
// 基礎(chǔ)類型檢測 (`null` 意思是任何類型都可以)
propA: Number,
// 多種類型
propB: [String, Number],
// 必傳且是字符串
propC: {
type: String,
required: true
},
// 數(shù)字,有默認(rèn)值
propD: {
type: Number,
default: 100
},
// 數(shù)組/對象的默認(rèn)值應(yīng)當(dāng)由一個(gè)工廠函數(shù)返回
propE: {
type: Object,
default: function () {
return { message: 'hello' }
}
},
// 自定義驗(yàn)證函數(shù)
propF: {
validator: function (value) {
return value > 10
}
}
}
})
type 可以是下面原生構(gòu)造器
String Number Boolean Function Object Array Symbol
type 也可以是一個(gè)自定義構(gòu)造器函數(shù),使用 instanceof 檢測。
當(dāng) prop 驗(yàn)證失敗,Vue 會在拋出警告 (如果使用的是開發(fā)版本)。props會在組件實(shí)例創(chuàng)建之前進(jìn)行校驗(yàn),所以在 default 或 validator 函數(shù)里,諸如 data、computed 或 methods 等實(shí)例屬性還無法使用
下面是一個(gè)簡單例子,如果傳入子組件的message不是數(shù)字,則拋出警告
<div id="example">
<parent></parent>
</div>
<script>
var childNode = {
template: '<div>{{message}}</div>',
props:{
'message':Number
}
}
var parentNode = {
template: `
<div class="parent">
<child :message="msg"></child>
</div>`,
components: {
'child': childNode
},
data(){
return{
msg: '123'
}
}
};
// 創(chuàng)建根實(shí)例
new Vue({
el: '#example',
components: {
'parent': parentNode
}
})
</script>
傳入數(shù)字123時(shí),則無警告提示。傳入字符串'123'時(shí),結(jié)果如下所示

將上面代碼中,子組件的內(nèi)容修改如下,可自定義驗(yàn)證函數(shù),當(dāng)函數(shù)返回為false時(shí),則輸出警告提示
var childNode = {
template: '<div>{{message}}</div>',
props:{
'message':{
validator: function (value) {
return value > 10
}
}
}
}
在父組件中傳入msg值為1,由于小于10,則輸出警告提示
var parentNode = {
template: `
<div class="parent">
<child :message="msg"></child>
</div>`,
components: {
'child': childNode
},
data(){
return{
msg:1
}
}
};

單向數(shù)據(jù)流
prop 是單向綁定的:當(dāng)父組件的屬性變化時(shí),將傳導(dǎo)給子組件,但是不會反過來。這是為了防止子組件無意修改了父組件的狀態(tài)——這會讓應(yīng)用的數(shù)據(jù)流難以理解
另外,每次父組件更新時(shí),子組件的所有 prop 都會更新為最新值。這意味著不應(yīng)該在子組件內(nèi)部改變 prop。如果這么做了,Vue 會在控制臺給出警告
下面是一個(gè)典型例子
<div id="example">
<parent></parent>
</div>
<script>
var childNode = {
template: `
<div class="child">
<div>
<span>子組件數(shù)據(jù)</span>
<input v-model="childMsg">
</div>
<p>{{childMsg}}</p>
</div>
`,
props:['childMsg']
}
var parentNode = {
template: `
<div class="parent">
<div>
<span>父組件數(shù)據(jù)</span>
<input v-model="msg">
</div>
<p>{{msg}}</p>
<child :child-msg="msg"></child>
</div>
`,
components: {
'child': childNode
},
data(){
return {
'msg':'match'
}
}
};
// 創(chuàng)建根實(shí)例
new Vue({
el: '#example',
components: {
'parent': parentNode
}
})
</script>
父組件數(shù)據(jù)變化時(shí),子組件數(shù)據(jù)會相應(yīng)變化;而子組件數(shù)據(jù)變化時(shí),父組件數(shù)據(jù)不變,并在控制臺顯示警告

修改prop中的數(shù)據(jù),通常有以下兩種原因
1、prop 作為初始值傳入后,子組件想把它當(dāng)作局部數(shù)據(jù)來用
2、prop 作為初始值傳入,由子組件處理成其它數(shù)據(jù)輸出
對于這兩種情況,正確的應(yīng)對方式是
1、定義一個(gè)局部變量,并用 prop 的值初始化它
props: ['initialCounter'],
data: function () {
return { counter: this.initialCounter }
}
2、定義一個(gè)計(jì)算屬性,處理 prop 的值并返回
props: ['size'],
computed: {
normalizedSize: function () {
return this.size.trim().toLowerCase()
}
}
[注意]JS中對象和數(shù)組是引用類型,指向同一個(gè)內(nèi)存空間,如果 prop 是一個(gè)對象或數(shù)組,在子組件內(nèi)部改變它會影響父組件的狀態(tài)
總結(jié)
以上所述是小編給大家介紹的Vue組件選項(xiàng)props實(shí)例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Vue OptionsAPI與CompositionAPI的區(qū)別與使用介紹
OptionsAPI和CompositionAPI是Vue.js框架中兩種不同的組件編寫方式,OptionsAPI通過對象字面量定義組件,以屬性分隔不同功能,響應(yīng)式數(shù)據(jù)通過data屬性定義,本文給大家介紹Vue OptionsAPI與CompositionAPI的區(qū)別,感興趣的朋友一起看看吧2024-10-10
ant-design-vue導(dǎo)航菜單a-menu的使用解讀
這篇文章主要介紹了ant-design-vue導(dǎo)航菜單a-menu的使用解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
Vue響應(yīng)式原理及雙向數(shù)據(jù)綁定示例分析
這篇文章主要為大家介紹了Vue響應(yīng)式原理及雙向數(shù)據(jù)綁定的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
vue之el-menu-item如何更改導(dǎo)航菜單欄選中的背景顏色
這篇文章主要介紹了vue之el-menu-item如何更改導(dǎo)航菜單欄選中的背景顏色問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
安裝vue無法運(yùn)行、此系統(tǒng)無法運(yùn)行腳本問題及解決
這篇文章主要介紹了安裝vue無法運(yùn)行、此系統(tǒng)無法運(yùn)行腳本問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
Vue3實(shí)現(xiàn)動態(tài)路由與手動導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了如何在?Vue?3?中實(shí)現(xiàn)動態(tài)路由注冊和手動導(dǎo)航,確保用戶訪問的頁面與權(quán)限對應(yīng),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
Vue雙向數(shù)據(jù)綁定與響應(yīng)式原理深入探究
本節(jié)介紹雙向數(shù)據(jù)綁定以及響應(yīng)式的原理,回答了雙向數(shù)據(jù)綁定和數(shù)據(jù)響應(yīng)式是否相同,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-08-08

