vue教程-props 检查类型、指定默认值、指定是否必填

说明

可以为组件的 props 指定验证要求:

  • 限制数据类型(可以指定多个类型)
  • 指定默认值
  • 是否必填
  • 。。。。

如果有一个限制条件 没有满足,在 浏览器控制台中警告,如下:

官网见 链接

实现方法

props 中的值是 一个带有 验证需求的对象,而不是 一个字符串数组

如下:

props:{//定义子组件时,需要指定 props ,作用是给组件定义属性,表示父组件要传入数据
    name:String,//关键:限制数据类型
    sex:String,
    age:Number
    }

简单案例

创建组件

在 components 目录下,创建文件 UserInfo2.vue,内容如下:

<template>
    <div id="app">
        UserInfo2
        <div>昵称:{{name}}</div>
        <div>性别:{{sex}}</div>
        <div>年龄:{{age}}</div>
    </div>
</template>
<script>
export default {
    // data:function(){
    //     return {
    //         name:'李雷',
    //         sex:'男',
    //         age:20
    //     }
    // }
    props:{//定义子组件时,需要指定 props ,作用是给组件定义属性,表示父组件要传入数据
        name:String,//关键:限制 name 的数据类型是 String
        sex:String,//关键:限制 sex 的数据类型是 String
        age:Number//关键:限制 age 的数据类型是 Number
        }

}
</script>
<style scoped>
#app{
    border: red 1px solid;
}
</style>

使用组件-演示错误

修改 App.vue 文件,内容如下:

<template>
<!-- 模板 -->
  <div id="app">
    传递静态Prop,传递的数据都是String类型:
    <user-info2 name="韩梅梅" sex="女" age="21"/>
  </div>
</template>

<script>
//引入 UserInfo2 组件
import UserInfo2 from './components/UserInfo2'

export default {
  name: 'App',
  components: {
    'user-info2':UserInfo2 //注册局部组件
  }
}
</script>

结果

在控制台中报错,因为在父组件中,静态传递Prop,数据都是 String 类;但在子组件中,限制 age 数据是 Number 类型,类型不匹配,所以报错

如下图:

使用组件-演示正确

修改 App.vue 文件,内容如下:

<template>
<!-- 模板 -->
  <div id="app">
    传递动态Prop,演示正确:
    <user-info2 name="李雷" sex="男" :age="fage" />
  </div>
</template>

<script>
//引入 UserInfo2 组件
import UserInfo2 from './components/UserInfo2'

export default {
  name: 'App',
  components: {
    'user-info2':UserInfo2 //注册局部组件
  },
  data:function(){
    return {
      fage:22
    }
  }
}
</script>

数据类型

限制的数据类型有:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol

指定 默认值、是否必填

创建组件

修改文件 UserInfo2.vue,内容如下:

<template>
    <div id="app">
        UserInfo2
        <div>昵称:{{name}}</div>
        <div>性别:{{sex}}</div>
        <div>年龄:{{age}}</div>
        <div>爱好:<span v-for="(item,index) in likes" :key="index">{{ item }} </span></div>
    </div>
</template>
<script>
export default {
    // data:function(){
    //     return {
    //         name:'李雷',
    //         sex:'男',
    //         age:20
    //     }
    // }
    props:{//定义子组件时,需要指定 props ,作用是给组件定义属性,表示父组件要传入数据
        name:{
            String,//关键:限制 name 的数据类型是 String
            required:true//关键:必填项
        },
        sex:{
            type:String,//关键:限制 sex 的数据类型是 String
            default:'男'//关键:不传 sex时,显示默认值
            },
        age:{
            type:Number,//关键:限制 age 的数据类型是 Number
            },
        likes:Array //关键:限制 likes 的数据类型是 Array
        },

}
</script>
<style scoped>
#app{
    border: red 1px solid;
}
</style>

注意:

  • required 和 default 一般不会同时出现

  • 一个属性可以指定多个类型,如:type:[String,Number],表示传入数据类型可以是String或Number

使用组件-演示错误

修改 App.vue 文件,内容如下:

<template>
<!-- 模板 -->
  <div id="app">
    传递静态Prop,不设置 name 会报错 name是必填项 <br>
    传递静态Prop,不设置 sex 会显示默认值 男 <br>
    <user-info2 age="21" likes="['王者荣耀','抖音','吃鸡']"/>
  </div>
</template>

<script>
//引入 UserInfo2 组件
import UserInfo2 from './components/UserInfo2'

export default {
  name: 'App',
  components: {
    'user-info2':UserInfo2 //注册局部组件
  }
}
</script>

报错如下:

使用组件-演示正确

修改 App.vue 文件,内容如下:

<template>
<!-- 模板 -->
  <div id="app">
    传递动态Prop,不设置 sex 会取默认值 男:
    <user-info2 :name="fname" :age="fage" :likes="flikes"/>
  </div>
</template>

<script>
//引入 UserInfo2 组件
import UserInfo2 from './components/UserInfo2'

export default {
  name: 'App',
  components: {
    'user-info2':UserInfo2 //注册局部组件
  },
  data:function(){
    return {
      fname:'张三',
      fage:22,
      flikes:['王者荣耀','抖音','吃鸡']
    }
  }
}
</script>

原文出处:/show_1IX2jCE0DkwN.html