我们可以为组件的 prop 指定验证要求,例如你可以要求一个 prop 的类型为什么。如果说需求没有被满足的话,那么Vue会在浏览器控制台中进行警告,这在开发一个会被别人用到的组件时非常的有帮助。
为了定制 prop 的验证方式,你可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:

  1. Vue.component('my-component', {
  2. props: {
  3. title: String, //第一个数据
  4. likes: Number, // 第一个数据 后面都是
  5. isPublished: Boolean,
  6. commentIds: Array,
  7. author: Object,
  8. callback: Function,
  9. contactsPromise: Promise
  10. }
  11. })

上述代码中,对prop进行了基础的类型检查,类型值可以为下列原生构造函数中的一种:StringNumberBooleanArrayObjectDateFunctionSymbol、任何自定义构造函数、或上述内容组成的数组。
需要注意的是nullundefined 会通过任何类型验证。
除基础类型检查外,我们还可以配置高级选项,对prop进行其他验证,如:类型检测、自定义验证和设置默认值。
如:

  1. Vue.component('my-component', {
  2. props: {
  3. title: {
  4. type: String, // 检查 prop 是否为给定的类型
  5. default: '杉杉最美', // 为该 prop 指定一个默认值,对象或数组的默认值必须从一个工厂函数返回,如:default () { return {a: 1, b: 10} },
  6. required: true, // 定义该 prop 是否是必填项
  7. validator (prop) { // 自定义验证函数,该prop的值回作为唯一的参数代入,若函数返回一个falsy的值,那么就代表验证失败
  8. return prop.length < 140;
  9. }
  10. }
  11. }
  12. })

示例

正确示例

  1. <section id="app">
  2. <prop-verification :list='list'></prop-verification>
  3. </section>
  4. <script>
  5. Vue.component('prop-verification',{
  6. props:['list'],
  7. template:`
  8. <ul class="list">
  9. <li class="item" v-for='item in list' :key='item.name'> {{ item.name }} </li>
  10. </ul>
  11. `
  12. })
  13. const vm = new Vue({
  14. el: '#app',
  15. data:{
  16. list:[
  17. {name:'张三'},
  18. {name:'李四'}
  19. ]
  20. },
  21. })
  22. </script>

运行结果
image.png

数据类型错误

当vm.data.list 不是一个数组时

  1. <section id="app">
  2. <prop-verification :list='list'>
  3. </prop-verification>
  4. </section>
  5. <script>
  6. Vue.component('prop-verification',{
  7. props:['list'],
  8. template:`
  9. <ul class="list">
  10. <li class="item" v-for='item in list' :key='item.name'> {{ item.name }} </li>
  11. </ul>
  12. `
  13. })
  14. const vm = new Vue({
  15. el: '#app',
  16. data:{
  17. // 此处数据类型错误,但是控制台不会报错
  18. // 渲染结果是:由于使用的li元素,只会显示两个小圆点,数据无法显示
  19. list:2,
  20. },
  21. })
  22. </script>

效果图
image.png
图中没有报错信息,页面只有li元素的小圆点

对传入数据进行类型判断

  1. <section id="app">
  2. <prop-verification :list='list'>
  3. </prop-verification>
  4. </section>
  5. <script>
  6. Vue.component('prop-verification',{
  7. props:{
  8. // list:Array, // 只为一个数据类型
  9. list:[Array,Object], // 为多个数据类型
  10. },
  11. template:`
  12. <ul class="list">
  13. <li class="item" v-for='item in list' :key='item.name'> {{ item.name }} </li>
  14. </ul>
  15. `
  16. })
  17. const vm = new Vue({
  18. el: '#app',
  19. data:{
  20. // 此处数据类型错误,但是控制台不会报错
  21. // 渲染结果是:由于使用的li元素,只会显示两个小圆点,数据无法显示
  22. list:2,
  23. },
  24. })
  25. </script>

效果图
image.png
验证成功,控制报错错误,并且指出数据应该为神马类型,及当前传入的错误数据

详细判断

  1. <section id="app">
  2. <prop-verification :list='list'>
  3. </prop-verification>
  4. </section>
  5. <script>
  6. Vue.component('prop-verification',{
  7. props:{
  8. list:{
  9. type:[Array,Object], //检测数据类型
  10. default:[{name:'我是默认值1'},{name:'我是默认值2'}], //默认值
  11. required:true, // 是否必填
  12. // 检测是否符合规则
  13. validator (prop){
  14. // 数据的长度最短为三
  15. return prop.length > 2;
  16. }
  17. }
  18. },
  19. template:`
  20. <ul class="list">
  21. <li class="item" v-for='item in list' :key='item.name'> {{ item.name }} </li>
  22. </ul>
  23. `
  24. })
  25. const vm = new Vue({
  26. el: '#app',
  27. data:{
  28. list:[
  29. {name:'张三'},
  30. {name:'李四'}
  31. ]
  32. },
  33. })

效果
image.png
虽然数据长度不符合规则,但不影响运行