【Vue3】父子组件传参

1,182 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

父传子

在Vue2中,父组件想要向子组件传递数据,可以使用子组件的prop来进行,在Vue3中也同样可以如此,不同的是,在Vue2中定义组件的属性是在props对象中定义的,而在Vue3中则是使用 defineProps 函数来定义的。

这个函数不需要像ref、reactive那样要导入后才能使用,它可以直接在setup语法糖中使用,它根据是否使用了ts有两种使用的方法

未使用TS

如果未使用ts,则需要通过给 defineProps 传入一个对象做参数来进行属性的定义,而这个对象的写法与Vue2中props属性的写法一样的。

defineProps({
    title:string,
    list:number[]
})

使用了TS

如果在setup中使用了ts,那么就可以通过type来定义一种类型,然后把这种类型定义给 defineProps 函数即可。

type Props = {
    title:string,
    list:number[]
}
defineProps<Props>()

当然,即使使用了ts,也是可以通过给defineProps函数传参的方式来定义属性的。

子传父

在Vue2中,子组件可以通过自定义事件emit来向父组件传递参数,在Vue3中也是如此,不同的是,Vue3中使用的是 defineEmits 这个函数来实现。 defineEmits 接收一个数组做参数,数组中的元素就是自定义事件的名称,然后它返回的是一个函数,这个函数的第一个参数是对应自定义事件的名称,第二个参数则是要传递的参数。

// 子组件
const emit = defineEmits(['on-change','next']) // 自定义事件的名称
const handleChange = ()=>{
    emit('on-change',123) // 第一个参数是自定义事件的名称,第二个是要传递的参数
}

defineEmits 也是不需要手动导入可以直接使用的。

然后在父组件中可以这样使用

// 父组件
<div @on-change="handleSonChange">获取子组件传值</div>

上面代码的意思就是,当子组件触发了on-change事件的时候,就执行父组件中的handleSonChange方法。