Vue子组件中渲染动态组件无效(第一次无效、第二次有效)

本文探讨了在Vue框架中使用动态组件时遇到的问题,特别是在子组件对话框内加载动态组件首次失效的情况。分析了可能的原因,包括对话框异步加载和组件冲突,并提供了解决方案,即在子组件中采用组件对象数据作为组件数据。

问题分析

今天在写代码的时候,用到了 Vue框架的动态组件,本来用的好好的(具体用法参考官方文档),后来改进了一下业务功能,在子组建中也使用了和父组件相同的动态组件方法,由于子组件采用对话框i的形式,但是子组件中的动态组件却没有加载出来;准确来说是 第一次没有加载出来,返回上一级界面,重新进入组件,在打开对话框子组件有加载出来了

parent.vue


<div id="parent"> 
		<span>巴拉巴拉</span>
		<component :is="aaa"></components>
 </div>

new Vue({
	el: '#parent',
	data(){
	   return {
       		currentCom: 'aa'
     	}
	},
	components:  { aa: {} ,bb:{},cc:{} }
})

aa 组件是一个 封装的对话框组件

然后在 aa组件的对象里面

aa.vue

<div> <dialog :visiable="show"></dialog></div>

new Vue({
   el: '#aa',
   data(){
   	return {
      currentCom: 'bb',
      show: false
    }
   },
   mounted(){
   	this.show = true;
   },
   components:  { bb:{},cc:{} },
   template: `<div><component :is="currentCom"></component></div>`
   })

大概就是这样:
导致的问题就是, 第一次进入parent 组件 aa组件的对话框 中的动态组件 无效,第二次进入的时候 才有效

我猜测了一下原因:

1 由于我的dialog是通过visiable.sync 异步懒加载的,可能导致子组件没有得到初始化,
2 可能是由于父组件中也有相同的组件内容,无法第一次在子组件的加载

解决方法

在子组件中采用 组件对象数据作为 组件数据 (Vue[文档动态组件]第二个规则:一个组件的选项对象)
具体用法查看aa子组件的写法

之前是放到 components下, 这次不采用放到components下,而是直接把组件选项的对象赋值给 :is的对象

### Vue2 中父组件子组件传值第一次渲染失效的解决方案 在 Vue2 的开发过程中,当父组件子组件传递数据时,可能会遇到子组件首次渲染失败的情况。这通常是因为子组件尚未完成初始化或未完全渲染所致。 #### 原因分析 1. 子组件可能由于条件语句(如 `v-if` 或 `v-else`)未能及时渲染,导致 `$refs` 调用无效[^1]。 2. 如果多个相同类型的子组件存在,则需要通过 `$children` 来管理这些子组件实例[^2]。 3. 数据绑定方式不正确可能导致子组件无法接收到完整的初始值[^4]。 --- #### 解决方案一:确保子组件渲染后再操作 可以使用生命周期钩子函数 `nextTick` 确保 DOM 已更新并重新触发渲染逻辑: ```javascript this.$nextTick(() => { this.$refs.childComponent.someMethod(); // 调用子组件的方法 }); ``` 这种方式适用于依赖于 DOM 更新后的场景,并能有效避免子组件渲染的问题。 --- #### 解决方案二:改用 `v-show` 替代 `v-if` 如果子组件因为条件判断未渲染而导致问题,可考虑将 `v-if` 改为 `v-show`。虽然两者都能控制显示状态,但 `v-show` 不会销毁和重建组件实例,因此更适合动态切换展示的需求。 --- #### 解决方案三:优化 Props 传递方式 检查父组件子组件的数据传递是否存在问题。例如,以下写法会导致解析错误: ```html <infoChart :chart-data="chartData, tableDataProp" /> ``` 应改为分别传递参数的形式: ```html <infoChart :chart-data="chartData" :tabledata-prop="tableDataProp" /> ``` 这样能够确保每个 Prop 都独立生效而不发生冲突。 --- #### 解决方案四:利用 Provide/Inject 实现跨级通信 对于更复杂的父子关系(比如祖孙组件间),推荐采用 `provide/inject` 方式替代传统的 Props 和 Events 方法。例如,在祖父组件中定义提供项: ```javascript export default { provide() { return { newHouse: '大别墅' }; } } ``` 而在孙子组件中注入该变量即可: ```javascript props: ['house'], inject: ['newHouse'] template: `<div>孙子接收 {{ house }}, {{ newHouse }}</div>` ``` 此方法无需逐层传递数据,减少了耦合度的同时也提高了性能[^3]。 --- ### 总结 针对 Vue2 中父组件子组件传值首次渲染失效的问题,可以从以下几个方面入手解决: - 使用 `$nextTick` 确保子组件已经渲染; - 更换模板指令为 `v-show` 提高稳定性; - 正确配置 Props 参数以防止语法错误; - 对于多层级结构引入 `provide/inject` 进行高效通讯。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值