uni-app学习笔记十二-vue3中组件传值(属性传值)
在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 stringsreturn ['success', 'warning', 'danger'].includes(value)}},// 函数类型的默认值propH: {type: Function,// 不像对象或数组的默认,这不是一个// 工厂函数。这会是一个用来作为默认值的函数default() {return 'Default function'}}
})