VUE 学习——父组件传值给子组件

本文介绍了在Vue中如何通过props实现父组件向子组件的单向数据流通信。通过创建一个场景,展示了在父组件修改值后如何传递给子组件并显示。子组件通过定义props接收父组件的值,而父组件通过绑定值到子组件的属性来实现传值。此外,还提到了Vue中prop的更新特性以及可以传递的数据类型。

       在我们编写前端代码时,经常遇到的一种场景,子组件需要使用父组件的值,这种情况下,我们可以使用props帮助我们进行父子组件间的通信。这里我们先模拟一个场景,展示如何使用。

场景:在父组件修改值,传递给子组件,子组件进行显示,如下图所示。

                                                                 

实现:

(1)子组件定义与使用;

1、定义子组件subOneComponent.vue,在props中定义父组件传递的值;

props: {            
    inputValue: {                
        type: String, // 变量类型                
        default: function () { // 默认返回值,可以在此处对传过来的值进行操作                                        
             return ""                
        }            
   }        
},

2、在子组件中展示

### Vue3 中父组件 Props 子组件未接收到的原因分析 在 Vue3 的开发过程中,当父组件通过 `props` 向子组件递数据时,如果子组件未能成功接收到这些数据,通常可能由以下几个原因引起: #### 原因一:异步数据加载问题 父组件中的数据可能是通过 API 请求或其他异步操作动态获取的。然而,在这种情况下,子组件可能会在其挂载阶段之前就尝试访问尚未初始化完成的 `props` 数据[^2]。 #### 原因二:Props 初始化时机不匹配 Vue3 在组件实例化期间会先初始化 `props` 并将其递到子组件中。但如果父组件的数据是在子组件已经挂载之后才被更新,则可能导致子组件无法及时感知到新的变化[^5]。 --- ### 解决方案 以下是几种常见的解决方法,可以有效处理上述问题: #### 方法一:延迟子组件渲染 可以通过条件渲染的方式控制子组件的显示时间,只有当父组件的数据准备完毕后再渲染子组件。这种方式能够确保子组件在初次渲染时就能获得完整的 `props` 数据。 ```vue <template> <ChildComponent v-if="dataIsReady" :propData="parentData" /> </template> <script> export default { data() { return { parentData: null, dataIsReady: false, // 控制子组件是否渲染 }; }, async mounted() { const response = await fetchData(); // 模拟异步API请求 this.parentData = response; this.dataIsReady = true; // 数据准备好后允许渲染子组件 } }; </script> ``` #### 方法二:监听 Prop 变化并强制刷新 即使子组件初始状态未接收到 `props` 数据,也可以通过监听其变化来实现动态响应。利用 Vue 提供的 `watch` 或者组合式 API (`onUpdated`) 来检测 `props` 更新,并执行必要的逻辑。 ```javascript import { watch } from 'vue'; export default { props: ['propData'], setup(props) { watch( () => props.propData, (newVal) => { console.log('Prop Data Updated:', newVal); // 执行额外的操作以同步内部状态 } ); } }; ``` #### 方法三:使用默认填充 Props 为了避免因为缺少必要参数而导致功能异常,可以在定义 `props` 时为其设置合理的默认。这样即便父组件暂时没有提供具体数,也不会影响子组件的基础运行流程。 ```javascript export default { props: { propData: { type: String, required: false, default: '' // 设置默认为空字符串 } } }; ``` #### 方法四:结合 Reactive 对象管理状态 有时开发者希望将来自外部的只读型属性映射成可变形式以便于本地维护。此时需要注意的是直接绑定原始对象至反应机制下会造成不可预期的行为——即修改副本不会自动反馈给源端。因此建议采用深拷贝技术或者手动复制字段内容。 ```javascript import { reactive } from 'vue'; export default { props: ['initialValue'], setup(props) { const localState = reactive({ value: props.initialValue || '' }); return { localState }; // 返回局部变量作为模板上下文中可用的名字空间成员之一 } } ``` --- ### 总结 综上所述,针对 Vue3 父组件子组件却未被正常接收的情况,主要可以从调整渲染策略、增强事件监控以及优化配置等方面入手加以改进。每种方式各有优劣需视实际应用场景灵活选用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值