前军教程网

中小站长与DIV+CSS网页布局开发技术人员的首选CSS学习平台

Vue 3 组件属性的高级用法

在《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

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言