VUE父组件更新动态绑定的值无法及时同步到子组件props

本文探讨了在Vue.js开发中遇到的问题,即父组件动态绑定的对象属性值更新无法及时同步到子组件的props。结论是,当给对象添加属性时,应使用`$set`方法确保属性的响应性。文章通过背景介绍、问题描述和解决方法三个部分,详细解释了这个问题的出现原因和解决方案,重点指出在新增场景下,直接赋值会导致属性非响应式,而使用`$set`则能保持响应性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.结论

先放结论:vue中给对象添加属性时,不要直接赋值(如对空对象targetBrand使用this.targetBrand.brandLogo = picUrl赋值),应使用$set(如this.$set(this.targetBrand,'brandLogo',picUrl))

前者添加的属性是非响应式的,因此其值的更新不会引发vue的状态变化,而后者添加的属性则是响应式的。有关响应式的更多内容可以查看深入响应式原理 — Vue.js

1.背景

前端开发,技术栈Vue+Element Ui

问题是这样的,我有一个自定义组件QiniuUpload,大概是这样的

简洁起见无关代码就不展示了,上面还有一个根据picUrl属性展示对应地址图片的标签。重点关注红框中的内容,从上到下分别是:

  1. picUrl:props中的图片地址,负责由父组件动态传值,从而在子组件展示
  2. picUrlData:data中的图片地址,负责接收上传回调的图片地址,同时通过watch picUrl与其同步
  3. 将子组件上传回调的地址发送给父组件,以便父组件保存到数据库
父组件中调用子组件的方式

2.问题

我在父组件的一个新增/修改共用的el-dialog中用到了该组件,用来给数据库条目添加图片logo。修改现有条目时一切都运行正常,问题出在新增时。

新增时,我发现我通过子组件上传的图片地址尽管成功通过$emit回调给了父组件,父组件也成功更新了自己targetBrand.brandLogo的值,但父组件动态绑定给子组件的:pic-url="targetBrand.brandLogo"并没有传达给子组件的props,props中存储的仍然是之前的地址

只有我修改dialog中其他元素时,新的图片地址才会同步到子组件props。

3.解决方法

最终我发现,这是由于我在新增时将父组件存储表单元素的data类targetBrand设置为了空对象,随后使用 this.targetBrand.brandLogo = picUrl 给图片地址赋值,这就导致新增的图片地址属性是非响应式的,无法被vue监听到变化(见下图)

因此只需要在父组件接收子组件$emit上传地址的回调函数中,使用 this.$set(this.targetBrand,'brandLogo',picUrl) 取代之前的赋值方式即可解决。

 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值