uni-app学习笔记十二-vue3中组件传值(属性传值)

发布于:2025-05-30 ⋅ 阅读:(13) ⋅ 点赞:(0)

在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'
    }
  }
})


网站公告

今日签到

点亮在社区的每一天
去签到