在vue3中,父组件负责采集数据,子组件负责展示数据。那么父组件怎么向子组件中传值呢?
下面简单介绍下实现过程:
1.父组件index.vue中定义属性名和属性值
<template>
<view>
<UserInfo username="周芷若" avatar="/static/girl_001.jpeg"></UserInfo>
<UserInfo username="小昭" avatar="/static/girl_002.jpeg"></UserInfo>
<UserInfo :username="name" avatar="/static/girl_003.jpeg"></UserInfo>
</view>
</template>
<script setup>
import {ref} from "vue"
const name = ref("赵敏")
</script>
上面使用了2种方式赋值,一种是在html中直接赋值,另一种,在JS中赋值,html中使用插值表达式接收。
2.子组件user.vue中定义要接收的属性名
<script setup>
const props = defineProps(["username","avatar"])
</script>
3.子组件user.vue在html中使用,注意,属性名要一致。
<template>
<view class="userInfo">
<image :src="avatar" mode="" class="avatar"></image>
<view class="username">{{username}}</view>
</view>
</template>
上面src由于不是放地址,而是使用父组件定义的avatar属性的值,要使用v-bind:src来表示,简写为:src。
来看下效果
如果子组件中想生成新值,可以采用下面的方式
<template>
<view class="userInfo">
<image :src="avatar" mode="" class="avatar"></image>
<view class="username">{{myName}}</view>
</view>
</template>
<script setup>
const props = defineProps(["username","avatar"])
const myName = computed(()=>props.username+"yyds")
</script>
在上面的defineProps(["username","avatar"])方法中,我们还可以约束传过来值的类型,如果不传时使用默认值:
比如,下面的父组件中,第2个没有传usrname,第3个没有传avatar的值
<view>
<UserInfo username="周芷若" avatar="/static/girl_001.jpeg"></UserInfo>
<UserInfo avatar="/static/girl_002.jpeg"></UserInfo>
<UserInfo :username="name" ></UserInfo>
</view>
在子组件中可以通过这样使用默认值
<script setup>
// const props = defineProps(["username","avatar"])
const props = defineProps({
username:{
type:String,
default:"MM"
},
avatar:{
type:String,
default:"/static/girl_default.png"
}
})
</script>
来看实际的效果:
拓展:Prop 校验
Vue 组件可以更细致地声明对传入的 props 的校验要求。比如我们上面已经看到过的类型声明,如果传入的值不满足类型要求,Vue 会在浏览器控制台中抛出警告来提醒使用者。这在开发给其他开发者使用的组件时非常有用。
要声明对 props 的校验,你可以向 defineProps()
宏提供一个带有 props 校验选项的对象,例如:
defineProps({
// 基础类型检查
// (给出 `null` 和 `undefined` 值则会跳过任何类型检查)
propA: Number,
// 多种可能的类型
propB: [String, Number],
// 必传,且为 String 类型
propC: {
type: String,
required: true
},
// 必传但可为 null 的字符串
propD: {
type: [String, null],
required: true
},
// Number 类型的默认值
propE: {
type: Number,
default: 100
},
// 对象类型的默认值
propF: {
type: Object,
// 对象或数组的默认值
// 必须从一个工厂函数返回。
// 该函数接收组件所接收到的原始 prop 作为参数。
default(rawProps) {
return { message: 'hello' }
}
},
// 自定义类型校验函数
// 在 3.4+ 中完整的 props 作为第二个参数传入
propG: {
validator(value, props) {
// The value must match one of these strings
return ['success', 'warning', 'danger'].includes(value)
}
},
// 函数类型的默认值
propH: {
type: Function,
// 不像对象或数组的默认,这不是一个
// 工厂函数。这会是一个用来作为默认值的函数
default() {
return 'Default function'
}
}
})