vue3就应该这样学-14

56 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

组件注册之后,我们就可以使用了,但是有的时候组件需要从父组件来传值,然后需要给父组件反馈值,也就是组件间的通讯。

Props

props意思是组件的参数,这里的参数主要指的vue中绑定的值,但是实际上,vue中的props的范围很宽泛,只要你给组件上加的参数都可以通过props获取,如果你是给html元素添加的属性,则叫做attrs.

那么,怎么样声明这个变量是props呢,有2种方式

  • 方式1:简单声明
<child a="1" />
const props = defineProps(['a','b'])

这里只是用变量名作为props的判断依据,也就是说只要你给组件一个a属性,那么他就是子组件中的a. 但是这样有一个弊病,你无法校验传入参数的类型。如果你是一个人开发还好,如果是团队开发,你写一个公共组件,一个人传string,一个人传Boolean,然后你组件中这个值却又是number,那么你的组件估计天天被提bug.于是,vue中还有另一种声明方式,我称之为校验式声明。

  • 方式1:校验式声明
<child a="1" />
const props = defineProps({
    a:{type:String,require: true,validator:(val)=>['rewards','booking'].includes(val)}
})

这种声明方式可以校验你的参数类型,是否必传,还可以校验具体的值是否合法,我建议大家声明Props都采用这种方法,这样能减少很多错误

Props的类型

在实际开发中,props的类型是一个很容易被忽视的点。比如我们使用某组件库,它有一个closeable的props,意思是是否显示关闭按钮,它的类型是boolean型,于是你很随意的写上

<a-alert closeable="false" />

然后很惊讶的发现,这个关闭按钮会一直显示。原因是:当你不用v-bind的时候,props其实是string类型,而对于string类型,只要不为空都相当于true

因此你需要这样写

<a-alert :closeable="false" />

当你使用v-bind的时,vue会读取当前组件中的变量,而不是直接传字符串。

同时绑定多个props

如果你需要给组件中绑定很多props,你肯定不想一个一个写v-bind,vue3中提供这个简便api,还能够实现动态props

const obj = {
    a:1,
    b:2
....
}
<child v-bind="obj" />