vue組件開發(fā)props驗(yàn)證的實(shí)現(xiàn)
使用props
在Vue中父組件向子組件中傳送數(shù)據(jù)是通過props實(shí)現(xiàn)的,一個(gè)簡單的使用props的例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component :foo-message="fooMessage"></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: ['fooMessage'],
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: 123
}
});
</script>
</body>
</html>
為什么要有props驗(yàn)證
但是上面這種方式是建立在大家都很遵守約定的情況下的,想象一下當(dāng)有一個(gè)人要使用foo-component組件的時(shí)候,他可能對于其要接受的參數(shù)有什么要求并不是很清楚,因此傳入的參數(shù)可能會(huì)在開發(fā)子組件的人的意料之外,程序就會(huì)發(fā)生錯(cuò)誤,就像我們在函數(shù)調(diào)用之前先檢查一下函數(shù)一樣,props也可以進(jìn)行一個(gè)預(yù)先檢查。
平時(shí)調(diào)用函數(shù)的時(shí)候在函數(shù)開頭的地方都是一坨糊糊的參數(shù)檢查,這種寫法很不好了,所有后來就有了校驗(yàn)器模式(別去百度了,我隨口取的名字),校驗(yàn)器模式就是指把在函數(shù)開頭的對參數(shù)校驗(yàn)的部分提取出來作為一個(gè)公共的部分來管理,讓一個(gè)什么東西來專門負(fù)責(zé)校驗(yàn),當(dāng)類型不正確的時(shí)候就拋個(gè)異常根本不去調(diào)用這個(gè)函數(shù),很多框架設(shè)計(jì)時(shí)都是這么設(shè)計(jì)的(Spring MVC、Struts2等等),props也提供了這個(gè)功能,想一下如果沒有這個(gè)功能的話,為了保證正確性我們可能需要在每次使用props屬性之前都寫一坨代碼來檢查。校驗(yàn)器最大的好處就是大多數(shù)情況下我們只需要聲明我需要什么樣的數(shù)據(jù),讓校驗(yàn)器檢查好了再塞給我。
type
可以使用type來聲明這個(gè)參數(shù)可以接受的數(shù)據(jù)的類型,當(dāng)檢查規(guī)則只有一個(gè)的時(shí)候type可以略寫:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component :foo-message="fooMessage"></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: {
fooMessage: Number
},
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: 123
}
});
</script>
</body>
</html>
當(dāng)傳入的參數(shù)類型不正確的時(shí)候Vue會(huì)發(fā)出提示:

type接受多個(gè)類型
當(dāng)參數(shù)可以是多種類型的其中一個(gè)的時(shí)候,使用數(shù)組來表示。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component :foo-message="fooMessage"></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: {
fooMessage: [Number, String]
},
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: 123
}
});
</script>
</body>
</html>
type能夠指定的類型
type可以是以下原生類型:
- String
- Number
- Boolean
- Function
- Object
- Array
- Symbol
required
可以使用required選項(xiàng)來聲明這個(gè)參數(shù)是否必須傳入。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component :foo-message="fooMessage"></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: {
fooMessage: {
type: Number,
required: true
}
},
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: 256
}
});
</script>
</body>
</html>
當(dāng)未傳入?yún)?shù)時(shí):

default
使用default選項(xiàng)來指定當(dāng)父組件未傳入?yún)?shù)時(shí)props變量的默認(rèn)值:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: {
fooMessage: {
type: Number,
default: 128
}
},
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: 256
}
});
</script>
</body>
</html>
當(dāng)父組件未傳入?yún)?shù)時(shí)子組件的值是128,當(dāng)父組件傳入?yún)?shù)時(shí)是其指定的參數(shù),比如這里可以是256。
當(dāng)type的類型為Array或者Object的時(shí)候default必須是一個(gè)函數(shù):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: {
fooMessage: {
type: Array,
default: function(){
return ['foo', 'bar'];
}
}
},
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: ['f', 'o', 'o']
}
});
</script>
</body>
</html>
required && default ???
那么required和default是否能同時(shí)出現(xiàn)在一個(gè)props變量中呢?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: {
fooMessage: {
type: Number,
required: true,
default: 128
}
},
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: 256
}
});
</script>
</body>
</html>
渲染結(jié)果:

盡管控制臺上Vue報(bào)了錯(cuò)誤,但是props變量fooMessage還是使用了設(shè)置的default值。
事情不會(huì)這么簡單,再測試一下其它的情況,比如當(dāng)傳入的參數(shù)驗(yàn)證不通過的時(shí)候:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component :foo-message="fooMessage"></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: {
fooMessage: {
type: Number
}
},
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: 'foobar'
}
});
</script>
</body>
</html>
渲染結(jié)果:

fooMessage要求的類型是Number,傳入了一個(gè)String類型的,盡管在控制臺提示報(bào)了錯(cuò),但是仍然將其渲染了出來。
由此可以得出一個(gè)結(jié)論:Vue的props校驗(yàn)只是提供一個(gè)參考,并不是強(qiáng)制性的。
validator
當(dāng)校驗(yàn)規(guī)則很復(fù)雜,默認(rèn)提供的校驗(yàn)規(guī)則無法滿足的時(shí)候可以使用自定義函數(shù)來校驗(yàn)。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue Study</title>
</head>
<body>
<div id="app">
<foo-component :foo-message="fooMessage"></foo-component>
</div>
<script type="text/javascript" src="lib/vue.js"></script>
<script type="text/javascript">
var fooComponent = {
props: {
fooMessage: {
validator: function(value){
return value>=0 && value<=128;
}
}
},
template: '<div> {{ fooMessage }} </div>'
};
var vm = new Vue({
components: {
'foo-component': fooComponent
},
el: '#app',
data: {
fooMessage: 100
}
});
</script>
</body>
</html>
一個(gè)綜合的例子
props: {
// fooA只接受數(shù)值類型的參數(shù)
fooA: Number,
// fooB可以接受字符串和數(shù)值類型的參數(shù)
fooB: [String, Number],
// fooC可以接受字符串類型的參數(shù),并且這個(gè)參數(shù)必須傳入
fooC: {
type: String,
required: true
},
// fooD接受數(shù)值類型的參數(shù),如果不傳入的話默認(rèn)就是100
fooD: {
type: Number,
default: 100
},
// fooE接受對象類型的參數(shù)
fooE: {
type: Object,
// 當(dāng)為對象類型設(shè)置默認(rèn)值時(shí)必須使用函數(shù)返回
default: function(){
return { message: 'Hello, world' }
}
},
// fooF使用一個(gè)自定義的驗(yàn)證器
fooF: {
validator: function(value){
return value>=0 && value<=100;
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue mockjs編寫假數(shù)據(jù)并請求獲取實(shí)現(xiàn)流程
這篇文章主要介紹了Vue mockjs編寫假數(shù)據(jù)并請求獲取實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
vue select選擇框數(shù)據(jù)變化監(jiān)聽方法
今天小編就為大家分享一篇vue select選擇框數(shù)據(jù)變化監(jiān)聽方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
vue3.2最新語法使用socket.io實(shí)現(xiàn)即時(shí)通訊詳解
這篇文章主要為大家介紹了vue3.2最新語法使用socket.io實(shí)現(xiàn)即時(shí)通訊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Vue開發(fā)實(shí)現(xiàn)吸頂效果的示例代碼
這篇文章主要介紹了Vue開發(fā)實(shí)現(xiàn)吸頂效果的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
使用Vue.set()方法實(shí)現(xiàn)響應(yīng)式修改數(shù)組數(shù)據(jù)步驟
今天小編就為大家分享一篇使用Vue.set()方法實(shí)現(xiàn)響應(yīng)式修改數(shù)組數(shù)據(jù)步驟,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
Vue3?路由頁面切換動(dòng)畫?animate.css效果
這篇文章主要介紹了Vue3路由頁面切換動(dòng)畫animate.css效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09

