vue子组件无法根据prop属性值变法实现视图更新问题记录
创始人
2025-05-29 20:44:46

问题描述

在vue中,有一个父组件和一个子组件,在父组件里有一个变量,在这个变量里有一个属性值和一个回调函数,并且这个变量是通过computed直接return的,如下:

computed: {testObj() {return {name: '空标题',cb(option) {option.name = '标题更改了'}}}
}

在这个父组件中调用子组件并通过prop的形式将这个对象传递给子组件,如下:


testChild 这个子组件中,展示这个变量的name值,并有一个事件会触发这个变量的回调函数,更改这个name值,如下:


export default {name: 'TestChild',props:{testObj: {type: Object,default: ()=>({})}},mathods: {updateTest() {this.testObj.cb(this.testObj)console.log(this.testObj)}}
}

现在的问题是,在子组件触发更新事件后,通过console打印可以看到testObj中的name值已经发生了改变,但是视图并没有更新

原因分析

子组件视图之所以没有根据响应式实现更新跟computed的实现原理有关,在vue中,可以通过datacomputedpropwatch的方式为当前实例中的变量添加上响应式(vue2通过defineProperty方法,vue3通过proxy,实现原理这里不赘述)。但是他们之间的实现方式有所不同,在vue源码中computed是计算属性,也就意味着,computed首先是监听参与计算变量变化,进而通知watcher进行派发更新。如果参与计算的变量没有变化,而主动更改 computed 中的变量或者变量里的属性值,只能触发computedsetter方法(前提computed是通过getset设置的)。而在本示例下,父组件是返回一个完整的testObj对象,在父组件中没有任何变量参与其中计算,这就使得我们在更改testObj的属性值时,父组件认为这个testObj并没有更新不需要触发watcher进行派发更新。因此无论是在子组件还在在父组件,通过testObj.name 展示的值都无法进行更新。

解决方案

解决这个问题的方法可以有多种
一,可以把这个变量放到data中而不是computed

data() {return {testObj: {type: Object,default: ()=>({})}}
}

二、在计算属性中使用变量,通过更改这个变量实现computed更新

data() {return {isChange: false}
}
computed: {testObj() {return {name: isChange ? '标题更改了' : '空标题' ,cb(option) {this.isChange  = true}}}
}

三、在子组件中通过变量赋值的方法,将该变量重新加上响应式
因为在vue中只要在data()中定义变量,vue就会自动为其添加响应式


props:[testObj: {type: Object,default: ()=>({})}
],
data() {return {testObj_: {}}
},
created() {
this.testObj_ = this.testObj
}

以上就是相关的优化方案。

相关内容

热门资讯

拯救会议纪要!快用这三个音频转... Hello,大家好,我是指尖科技君~不知道小伙伴们平时有录音的习惯吗&#...
八个字的成语励志,奋斗的八字成... 八个字的成语励志目录八个字的成语励志奋斗的八字成语有哪些励志的8字成语八个字的成语励志 志存高...
进口汽车排量税怎么算(进口车辆... 本篇文章极速百科给大家谈谈进口汽车排量税怎么算,以及进口车辆排量税怎么算对应的知识点,希望对各位有所...
三星s6edge怎么更换电池,... 三星s6edge怎么更换电池目录三星s6edge怎么更换电池三星S6 Edge换电池:如何轻松DIY...
侏儒类仓鼠是哪些,侏儒仓鼠种类... 侏儒类仓鼠是哪些目录侏儒类仓鼠是哪些侏儒仓鼠种类仓鼠分多少种侏儒类仓鼠是哪些(侏儒类仓鼠有哪些)侏儒...
什么是BI ?企业数字化的规划... BI技术是使现代企业能够利用数据做出合理,基于事实和可行的决策以改善其运营和利润率的工...
手机上怎么查移动详单,如何查中... 1. 下载并打开中国移动APP。 3. 点击底部导航栏的“分类”。 4. 在“分类”页面...
最近有什么好看的电影吗,最近有... 最近有什么好看的电影吗目录最近有什么好看的电影吗最近有什么好看的电影啊(推荐几部必看的影片)最近有哪...
iphone8p尺寸多大,苹果... iphone8p尺寸多大目录iphone8p尺寸多大苹果8pIus屏幕长宽多少厘米?不是机身尺寸!是...
半夜影院开吗,电影院晚上几点关... 半夜影院开吗目录半夜影院开吗电影院晚上几点关门?凌晨两点多还能进电影院吗西宁凌晨能开的电影院有哪些半...
Python科研绘图——介绍 “在做科研的路上,避免不了制作结果图,像常见的作图软件如Prism&#x...
MySQL查看正在运行的SQL MySQL查看正在运行的SQL 前言 ​ 在安装MySQL的时候会默认初始化几个MySQL运行所需的...
秒杀限制人群,如何设计秒杀服务... 对于秒杀业务,大家应该比较熟悉了。比如,“某商品原价 1299 元&#x...
张国荣是怎么走的,张国荣怎么死... 张国荣是怎么走的目录张国荣是怎么走的张国荣怎么死的 张国荣去世原因张国荣是怎么去世的张国荣是怎么死的...
跨年之夜的说说,关于跨年夜的心... 跨年之夜的说说目录跨年之夜的说说关于跨年夜的心情说说 一个人跨年的伤感说说(精选28句)2022年跨...
三连是什么梗,网络用语三连是什... 三连是什么梗目录三连是什么梗网络用语三连是什么意思?小红书评论三连是什么意思?三连是什么梗 三...
博迪学校怎么招生,西安博迪小学... 博迪学校怎么招生目录博迪学校怎么招生西安博迪小学入学条件是什么教育培训机构如何去招生?博迪学校怎么招...
100天精通Python(可视... 文章目录0. 专栏导读1. 普通折线图2. 网格折线图3. 趋势折线图4. 对比折线图5. 百分比折...
基础和高级的ACL的基础配置和... 基础和高级的ACL的基础配置和原理 需求 如图配置设备的IP地址售后服务部不允许访问财务部服务器&#...
linux入门---gdb的使... 目录标题gdb是什么如何使用gdb打开文件如何查看release和debug的不同正式调试l断点运行...
会计做账步骤是什么,财务做账要... 会计做账步骤是什么目录会计做账步骤是什么财务做账要怎么做账会计做账的步骤一般是怎么样的呢?会计手工做...
大学生可以贷款吗,大学生可以向... 大学生可以贷款吗目录大学生可以贷款吗大学生可以向银行贷款吗在校大学生能贷款么?大学生可以贷款吗 ...
社交新时代,元宇宙结合游戏应用... 人是社会动物,需要进行社交。社交的本质是人与人之间通过某种方式或工具传递信息ÿ...
超市买的腊肠可以直接吃吗,超市... 超市买的腊肠可以直接吃吗目录超市买的腊肠可以直接吃吗超市买来的腊肠直接可以吃吗?腊肠买回来就能吃吗?...
讣告什么意思,讣告 [fù g... 讣告什么意思目录讣告什么意思讣告 [fù gào]什么意思?近义词和反义词是什么?英文翻译是什么?讣...
【JVM】字节码指令全解 文章目录 入门案例原始 java 代码编译后的字节码文件常量池载入运行时常量池方法字节码载入方法区m...
电动自行车后轮轴承怎么拆,拆装... 电动自行车后轮轴承怎么拆目录电动自行车后轮轴承怎么拆拆装电动车后轮及轴承视频教程电动车后轮轴承怎么拆...
奇葩说六季冠军分别是谁,奇葩说... 奇葩说六季冠军分别是谁目录奇葩说六季冠军分别是谁奇葩说第一届冠军是谁?
移动有什么套餐流量多,中国移动... 移动有什么套餐流量多目录移动有什么套餐流量多中国移动流量套餐有哪些?移动有什么流量多的套餐吗?移动有...
蓝桥杯刷题冲刺 | 倒计时20... 作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝...