当前位置: 首页 > news >正文

Vue 项目中父子传值使用Vuex异步数据不更新问题

一.背景 

在Vue项目开发中,我们经常需要在父组件中定义一个fields配置数组,然后将它传递给子组件,子组件根据fiedls渲染筛选表单 

比如:  我本来是想直接用vuex state里面的数据直接传过去的

//父组件
<SimpleFilterBar :fields="fields" :model="form" />//js部分 data () {return {fields: [{label: '运营区',prop: 'regionid',type: 'select',options: this.$store.state.regionList  // Vuex 异步数据}]}
},
created(){this.$store.dispatch('Publicdata/fetchRegionList')
}

问题来了,Vuex异步获取的regionList更新后,fields[0].options并不会自动更新,子组件也收不到最新数据,一直是空数组,也就是Vuex里面初始化的数据

二.原因分析 

Vue的响应式机制确实能追踪对象/数组的变化,但这里有一个 "初始化引用" 问题 : 

  • 当父组件执行data( ) 时, this.$store.state.regionList  还是一个空数组 [ ]; 
  • fields [0].options 就固定成了当时的那个空数组的引用; 
  • 后续Vuex 更新regionList时,fields[0].options 并没有重新绑定,而是仍然向老的引用; 
  • 所以,子组件里的fields 也不会随着Vuex 更新而变化 

换句话说: 响应式只会跟踪属性的变化,但不会帮你"替换引用"

三. 解决方案 

方案一:  使用计算属性(推荐)

直接把fields写成计算属性,而不是写死在data里

computed: {...mapState('Publicdata', ['regionList']),fields() {return [{label: '运营区',prop: 'regionid',type: 'select',options: this.regionList}]}
}
  • 优点 :  regionList 更新后, fields 会自动重新计算,子组件拿到的就是最新数据 
  • 缺点: 每次依赖变化都会诚信生成fiedls,但这点性能开销几乎可以忽略

方案二:  watch 赋值 

保留 fields 在 data 里,但监听Vuex数据变化,手动更新fields : 

data() {return {fields: [{ label: '运营区', prop: 'regionid', type: 'select', options: [] }]}
},
watch: {regionList(newVal) {this.fields[0].options = newVal}
},
computed: {...mapState('Publicdata', ['regionList'])
}
  • 优点: 对已有写法改动小; 
  • 缺点: 需要写watch,稍显繁琐

四. 总结

  • 问题本质: 在data( ) 里引用Vuex异步数据时,引用在初始化就固定了,不会随着Vuex后续更新自动刷新
  • 推荐方案: 把fileds定义成计算属性,依赖Vuex state; 这样数据更新-> fields更新->子组件也更新

http://www.dtcms.com/a/342579.html

相关文章:

  • Postman来做API安全测试:身份验证缺陷漏洞测试
  • 药品追溯码(溯源码)采集系统(二):门诊发药后端
  • 【Linux系统】进程信号:信号的产生和保存
  • 使用EasyExcel 导出复杂的合并单元格
  • 第四届中国高校机器人实验教学创新大赛团队参赛总结
  • selenium一些进阶方法如何使用
  • 大模型0基础开发入门与实践:第11章 进阶:LangChain与外部工具调用
  • 打破传统课程模式,IP变现的创新玩法 | 创客匠人
  • 从零开始学 Selenium:浏览器驱动、元素定位与实战技巧
  • 微服务:现代软件架构的主流范式
  • Linux mmap内存映射
  • 集中式负载均衡 vs. 分布式负载均衡
  • 【赵渝强老师】Redis Cluster分布式集群
  • #千问海报大赛
  • 订单簿动力学与深度学习模型的融合大单识别与短期市场价格波动预测
  • Java多线程编程基础篇
  • 多级缓存一致性矩阵:ABP vNext 下的旁路 / 写穿 / 写回组合实战
  • Qt的moveToThread使用
  • SQL-leetcode—3451. 查找无效的 IP 地址
  • centos常用命令
  • Visual Studio Code (VS Code) 工作区配置文件的作用
  • CentOS7安装部署NexusRepository
  • 【Spring Cloud 微服务】2.守护神网关Gateway
  • 告别人工建模:AI 自动化 ETL 工具对比,数据 pipeline 搭建时间缩短 60% 的实践
  • 洛谷 P2656 采蘑菇-普及+/提高
  • k 均值聚类算法总结
  • 从入门到精通:Java设计模式——单例模式
  • 8.21IPSEC安全基础后篇,IKE工作过程
  • 【TWT】
  • 常德二院信创转型实战:全栈国产化提升医疗效率与安全