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