2.4 组件间通信Props(父传子)

父组件

在父组件模板上的子组件上加上属性值,属性值就是想要传递给子组件的信息。
例如:

<template>
<div class="Big-box">
    <testBox :personList="p"></testBox>
</div>
</template>

子组件

子组件接收父子间传递的信息

const x = defineProps(['personList'])

子组件接收规范的父子间传递的信息

const x = defineProps<{personList:Person}>()

子组件接收规范的父子间传递的可选的非必要信息

const x = defineProps<{personList?:Person}>()

子组件接收规范的父子间传递的可选的非必要信息,有默认值

const x = withDefaults(defineProps<{personList?:Person}>(),{
	...
})
<think> 嗯,用户想了解Vue组件向子组件传参的方法。从引用内容看,用户提供了三个站内引用,都涉及到Vueprops传参机制。 用户可能是Vue初学者,正在学习组件通信。引用[1]和[2]都明确提到了props传递的基本用法,而引用[3]则指出了引用类型数据传递的注意事项。这说明用户可能已经查阅过基础文档,但需要更系统的总结。 准备这样构建回答: 首先用流程图解释单向数据流原理,因为这是Vue组件通信的核心概念。然后分步骤说明标准props传参流程: 1. 组件在子组件标签上绑定属性 2. 子组件通过props选项声明接收 3. 子组件使用数据 注意到引用[3]提到的深拷贝问题特别重要,需要单独强调引用类型数据的处理方式。准备用两个对比代码块展示错误和正确的做法。 用户可能还会关心类型校验和默认值设置,虽然引用里没提,但这属于进阶必备知识,考虑补充在代码示例里。 最后设计相关问题时会侧重实际开发场景,比如传参失效的调试方法和复杂数据结构处理,这样能覆盖用户后续可能遇到的问题。 </think> 以下是Vue组件向子组件传参的完整方法,结合核心原理和代码示例说明: ### 📌 一、核心原理 1. **单向数据流**:组件通过**props属性**向子组件传递数据(自上而下) 2. **数据类型**: - 基本类型:`String`/`Number`/`Boolean`等 - 引用类型:`Array`/`Object`等(需特殊处理)[^3] 3. **通信流程**: ```mermaid graph LR A[组件] -- props绑定数据 --> B[子组件标签] B -- 声明props接收 --> C[子组件内部使用] ``` ### 💻 二、标准传参步骤(Vue2/Vue3通用) #### 1. 组件(发送端) ```vue <template> <!-- 通过v-bind绑定数据 --> <ChildComponent :title="parentTitle" :items="parentItems" :is-active="true" /> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentTitle: "来自组件的标题", // 字符串 parentItems: [1, 2, 3] // 数组 } } } </script> ``` #### 2. 子组件(接收端) ```vue <template> <div> <h2>{{ title }}</h2> <!-- 直接使用props --> <ul> <li v-for="item in items" :key="item">{{ item }}</li> </ul> </div> </template> <script> export default { // 声明接收的props(推荐对象形式) props: { title: { type: String, // 类型校验 default: "默认标题" // 默认值 }, items: { type: Array, default: () => [] // 引用类型需用工厂函数返回 }, isActive: Boolean // 简写类型校验 } } </script> ``` ### ️ 三、关键注意事项 1. **引用类型处理**(重要!) 直接修改props中的数组/对象会污染组件数据: ```javascript // ❌ 错误做法(修改级数据) this.items.push(4) // ✅ 正确解决方案: // 方案1:深拷贝创建新对象 const localItems = JSON.parse(JSON.stringify(this.items)) localItems.push(4) // 方案2:通过事件通知组件修改 this.$emit('update-items', [...this.items, 4]) [^3] ``` 2. **Prop命名规范** - HTML中需使用 **kebab-case**(短横线命名) ```vue <!-- 组件模板 --> <ChildComponent :user-name="name" /> ``` ```javascript // 子组件props使用camelCase props: { userName: String // 自动转换命名 } ``` 3. **动态更新** 组件数据更新时,子组件的props会自动同步(无需手动监听) ### 🔍 四、特殊场景处理 ```vue <!-- 1. 传递所有propsVue2.4+) --> <ChildComponent v-bind="$props" /> <!-- 2. 非Prop属性继承 --> <ChildComponent class="extra-class" /> ``` ### 🌐 五、Vue3组合式API示例 ```vue <!-- 子组件 --> <script setup> // defineProps编译器宏 const props = defineProps({ title: { type: String, required: true } }) console.log(props.title) </script> ``` 📚 **引用说明**: 以上实现基于Vue的单向数据流设计,props作为通信的基础通道[^1],对于引用类型数据需特别注意数据隔离原则[^3],实际开发中建议结合自定义事件实现完整数据流管理[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值