VUE3组件 (1) 关于defineProps()

本文详细介绍了Vue3中如何使用defineProps定义组件属性接收父组件的数据,并探讨了ProvideInject的依赖注入机制。实例演示了如何在blog和article组件间传递数据,以及注意事项,如单向数据流和避免重复绑定。

前言

以下代码和内容的使用都是在setup中,未使用TS。

<script setup>
</script>

VUE3组件 (2) 关于defineEmits()

VUE3组件 (3) 关于 slot 插槽

VUE3组件 (4) 关于 Provide Inject 依赖注入


使用defineProps

单文件组件中,向组件传递数据,下面以 blog(父组件)和article(子组件)为例。

1.例子

在blog.vue中,先引入article。

// Blog.vue
<template>
	<Aritice :title="AriticeItem.title" :info="AriticeItem.info" :author="AriticeItem.author">
	 <!-- v-bind ( : ) ,父组件将值绑定到子组件上 -->
    </Aritice>
</template>
<script setup>
	import { reactive } from 'vue';
	import Article from '@/components/Article.vue';
	const AriticeItem = reactive({
		title: '文章标题',
	    info: '文章内容',
	    author: 'X',
	  });
</script>

//Article.vue
<template>
	<section>
  		<p>{{ title }}</p>
    	<p>{{ info }}</p>
    	<p>{{ author }}</p>
	</section>
</template>
<script setup>
	const props = defineProps({
		title: String,
		info: String,
		author: String,
	});// 对象形式声明 props
	// 等价于以 字符串数组声明 props
	//const props = defineProps(['title', 'info', 'author']);
	// 如果在setup中使用则直接 props.title
</script>
<style></style>

2.说明

  • 对象形式声明:key 是对应的名称。value在上面的示例中是prop中对应的类型。value的具体格也可以是一个对象,常用的属性如下
{
	type:String ,// 如果可能存在多个类型,则可以写成 [String,Number]
	default:'默认值',
	required: true// 是否必传 ,在不声明为true 的情况下,所有prop 默认为非必填。
}
// 上面的title 字段展开则为
title:{
	type:String
}
  • 字符串数组声明:数组的每一项字面量就为prop对应的名称。

3 使用

在template 模版中,直接使用 defineProps() 声明过后的名称。
在setup中(以1.例子中的代码为例),只需要直接 props.title 就可以获取到title 对应的值。


props一般是单向的,在子组件中不应该对 props 进行修改。如果需要在子组件中对props进行处理,应当使用ref(初始值为props的值):

const formatTitle = ref(props.title)
//这样,子组件中后续对 formatTitle 的修改,就与原props.title 无关联了

如果子组件中对数据更新,确实需要修改原数据,那么应当通知父组件或者props传入的地方,对数据进行调整(涉及到组件的事件)


补充

在上述例子中,props是一个对象,并且每个属性都要传递到子组件中,可以使用不指定参数的,v-bind 方法:

 <Aritice v-bind="AriticeItem"></Aritice>
 <!-- 也可 <Aritice :="AriticeItem"></Aritice>-->
 <!-- 子组件中的声明不需要改变,但是需要将用到的AriticeItem的属性,都通过 defineProps 显示出来-->

每一个在组件上 v-bind( : ) 的值,都不应该重复(无参数的v-bind重复出现,编辑器会报错)。如果出现同名的 v-bind 绑定,后绑定会覆盖前一个。
需要注意的是,props的名称不应该与组件中的其它属性名称重复。

参考

单文件组件
组件基础
Props

### Vue3 中父子组件通过 `defineProps` 进行通信 在 Vue3 的组合式 API 中,`defineProps` 是一种用于定义子组件接收父组件传递数据的方法。它允许开发者声明 props 并指定其类型和其他约束条件[^2]。 #### 父组件向子组件传值示例 以下是父组件向子组件传递数据的具体实现: ##### 父组件代码 ```vue <template> <div> <h1>父组件</h1> <ChildComponent :message="parentMessage" /> </div> </template> <script setup> import ChildComponent from &#39;./ChildComponent.vue&#39;; const parentMessage = &#39;这是来自父组件的消息&#39;; </script> ``` 在此代码中,父组件通过属性绑定的方式 (`:message`) 将变量 `parentMessage` 的值传递给子组件[^1]。 ##### 子组件代码 ```vue <template> <div> <p>{{ message }}</p> </div> </template> <script setup> // 定义 Props 接收父组件的数据 const props = defineProps({ message: { type: String, required: true, // 表明此 prop 是必需的 } }); </script> ``` 在这个例子中,子组件使用了 `defineProps` 方法来声明一个名为 `message` 的 prop,并指定了它的类型为字符串以及它是必需的。 --- ### 关键点解析 - **`defineProps` 的作用** `defineProps` 是 Vue3 提供的一个宏,在 `<script setup>` 中无需导入即可直接使用。它可以用来定义子组件接收到的 props 数据结构及其验证规则。 - **Prop 验证规则** 开发者可以通过对象形式为每个 prop 设置详细的验证规则,例如类型、默认值和是否必填等。 --- ### 总结 通过上述方式,可以轻松实现父组件向子组件传递数据的功能。父组件只需将所需数据作为属性绑定到子组件上,而子组件则利用 `defineProps` 来接收并处理这些数据。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余九月丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值