Vue.js 允许我们为组件的 prop 指定验证要求,例如你知道的这些类型。如果有一个需求没有被满足,则 Vue 会在浏览器控制台中警告你。这在开发一个会被别人用到的组件时尤其有帮助。
为了定制 prop 的验证方式,你可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:
Vue.component('my-component', {
props: {
// 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
propA: Number,
// 多个可能的类型
propB: [String, Number],
// 必填的字符串
propC: {
type: String,
required: true
},
// 带有默认值的数字
propD: {
type: Number,
default: 100
},
// 带有默认值的对象
propE: {
type: Object,
// 对象或数组默认值必须从一个工厂函数获取
default: function () {
return { message: 'hello' }
}
},
// 自定义验证函数
propF: {
validator: function (value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].includes(value)
}
}
}
})当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。
注意:那些 prop 会在一个组件实例创建之前进行验证,所以实例的属性 (如 data、computed 等) 在 default 或 validator 函数中是不可用的。
该示例定义了一个组件,组件的 Prop 通过对象进行定义,包括 Prop 类型、是否必填、默认值和自定义校验器等,代码如下:
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue</title>
<!-- 使用 CDN 引入 Vue 库 -->
<!-- <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.9/vue.js"></script>
</head>
<body>
<div id="app">
<input type="text" placeholder="enter title" v-model="title" />
<my-component v-bind:my-title="title"></my-component>
</div>
<script type="text/javascript">
Vue.component("my-component", {
props: {
myTitle: {
type: String,
// 必填
required: true,
// 自定义校验器
validator: function (value) {
return value != null && value.length > 5;
}
},
myCount: {
type: Number,
// 默认值为 1024
default: 1024
}
},
data: function(){
return {
count: this.myCount
};
},
template: `
<div style="background:red;">
<h2>{{myTitle}}</h2>
<p>Count: {{count}}</p>
<p>
<button v-on:click="incr">myCount++</button>
</p>
</div>
`,
methods: {
incr: function(){
this.count += 1;
}
}
});
var app = new Vue({
el: "#app",
data: {
title: "Hello Vue.js"
}
});
</script>
</body>
</html>运行效果图:

上图中,当我们删除 title,title 长度小于等于 5 时输出了错误信息。