在《Vue 3 组件入门》中,我们知道,使用 defineProps() 可以定义属性,只需将属性名放在数组中即可:
如果我们想限制属性的类型,应该如何做?
定义属性类型
如果要定义(限定)属性类型,可以在 defineProps 宏中使用对象语法。
使用该组件时,父组件必须按照给定类型传入属性:
如果传入的类型不对,Vue 会抛出警告。比如,如果给上面的 likes 属性传入字符串值 "42",在开发者工具将看到如下信息:
如果使用 TypeScript,可以利用泛型传入属性的类型定义。
如果属性名称较长,定义属性时推荐使用驼峰写法(camelCase):
在父组件模板使用的子组件,为了和 HTML 规范保持一致,属性名推荐使用短横线命名法(kebab-case)。
如果希望将一个 object 的所有字段当作属性传递,可以使用不带参数的 v-bind 指令。
上面代码和如下模板表示的含义完全相同:
单向数据流
父子组件之间的属性传递形成了一种单向数据流(One-Way Data Flow),数据自上而下有序传导。
在这种模式下,属性值是只读的。因为属性值来自父组件,如果任由子组件修改,可能会造成代码逻辑难以理解。
如果不小心修改了只读属性,Vue 会给出警告:
在单向数据流的模式下,如果要修改属性,一般的做法是子组件抛出事件,通知父组件修改。
属性校验
除了上述的属性类型,Vue 还提供了一些更丰富的属性校验方法。
属性可以有多种类型:
所有属性默认是非必填的,除非使用 required: true 指定为必填项。
如果必填项为空,Vue 会给出警告:
可以使用 default 指定默认值。对于 Number、String 等原始类型,直接使用字面量常量即可:
对于 Object, Array 类型的属性,default 需要使用工厂方法(factory function),该方法的返回值将成为属性的默认值。
可以使用 validator() 方法自定义校验逻辑。该方法的入参有两个,第一个是当前属性的值,第二个是所有属性组成的对象。
当属性未能通过校验规则,Vue 会给出如下警告:
运行时类型检查
对于属性类型 type 的取值,可以是如下的原生构造函数:
- String
- Number
- Boolean
- Array
- Object
- Date
- Function
- Symbol
- Error
除此之外,也可以使用自定义类型或构造函数。此时,Vue 会使用 instanceof 运算符进行类型判定。
如果使用了不匹配的类型,Vue 会报错:
参考资料
- Props, https://vuejs.org/guide/components/props.html
完