Props
一个组件需要显式声明它所接受的 props,这样 Vue 才能知道外部传入的哪些是 props。
setup
在使用 <script setup> 的单文件组件中,props 可以使用 defineProps() 宏来声明:
vue
1 | <script setup> |
TS
1 | <script setup lang="ts"> |
注意
props 是 Ref 类型,内部的属性不是。
使用自定义类型
1 | interface TGoods { |
默认值
1 | const props = defineProps({ |
非setup
在没有使用 <script setup> 的组件中,props 可以使用 props 选项来声明:
JS
1 | export default { |
注意传递给 defineProps() 的参数和提供给 props 选项的值是相同的,两种声明方式背后其实使用的都是 props 选项。
props属性监听
1 | <script setup> |
v-model
v-model 可以在组件上使用以实现双向绑定。
单个属性
从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏:
自定义组件中
1 | <!-- Child.vue --> |
父组件可以用 v-model 绑定一个值:
1 | <!-- Parent.vue --> |
defineModel() 返回的值是一个 ref。
它可以像其他 ref 一样被访问以及修改,不过它能起到在父组件和当前变量之间的双向绑定的作用:
- 它的
.value和父组件的v-model的值同步; - 当它被子组件变更了,会触发父组件绑定的值一起更新。
defineModel 是一个便利宏。
编译器将其展开为以下内容:
- 一个名为
modelValue的 prop,本地 ref 的值与其同步; - 一个名为
update:modelValue的事件,当本地 ref 的值发生变更时触发。
TS中设置类型
1 | const model = defineModel<number[]>() |
多个属性
1 | <script setup> |
父组件可以用 v-model 绑定多个值:
1 | <Child v-model:firstName="firstName" v-model:lastName="lastName" /> |
事件
1 | <script setup> |
TS中使用
1 | <script setup lang="ts"> |
props、computed、data
这三者都可以用来做数据绑定。
如果要双向绑定或者修改数据建议使用data,props可以修改,但是违反了单向数据流原则,computed 本身不用于双向绑定,它是只读的。
如果想修改props中对象的数据,建议复制 props 对象,然后修改副本,而不是直接修改原始对象。
示例1
1 | <template> |
局部注册(推荐)
局部注册的组件仅在当前组件内可用,避免全局污染,是日常开发的首选方式。
步骤
- 导入组件:在使用组件的文件中,通过
import导入目标组件。 - 直接使用:在
<template>中直接使用组件名作为标签(组件名建议使用 PascalCase 或 kebab-case,Vue 会自动转换)。
示例
1 | <!-- ParentComponent.vue --> |
注意:在
<script setup>语法中,导入的组件会自动注册,无需像 Vue2 那样在components选项中声明
全局注册
全局注册的组件在整个应用中都可直接使用,无需重复导入,适合通用组件(如按钮、图标等)。
步骤
- 在入口文件(如
main.js或main.ts)中导入组件。 - 通过
app.component()方法注册组件。
示例
1 | // main.js |
动态组件(根据条件切换)
使用 <component> 标签配合 is 属性,可以动态渲染不同组件:
1 | <template> |