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

vue3小坑之-为什么把ref定义的数组赋值给数组对象后取值为空数组?

天呢,居然两年没有上博客园看过了,呜呜呜,日渐废柴

这次总结一个码代码的时候遇到的问题,为什么把数据赋值给数组对象的某个字段,打印出来的是个空数组?

错误写法一:

// 动态获取list值,前端可以增删改查
const list = ref([// 也许有数据也许没数据
]) // 将值赋值给数组对象的某元素arr
const listArr = ref([{ type: 'fuzhi', arr: list.value },
])// 不管list是否有值,打印出来的都是空数组,数据失去响应了
console.log(listArr[0].arr) 

怎么不行了呢?此时还不知道原因,那我换个写法试试

错误写法二:

const list = ref([]) // 赋值整个ref响应式的数据
const listArr = ref([{ type: 'fuzhi', arr: list},
])// 打印出来的还是空数组
console.log(listArr[0].arr.value) 

恩?结果还是不行?我确定这样是引用的地址呀?在我使用了AI大法和百度大法之后,终于找到了原因如下:

写法一相当于:

const snapshot = list.value // 获取当前快照
const listArr= ref([{ arr: snapshot }]) // 存储静态拷贝

ref的.value会解包当前的对象值,深拷贝了一份数据.理解成只要.value一次,就生成了当前数据的一份快照.

没错,不管什么时候,只要定义一个变量接受xxx.value,当前xxx.value是什么值,那它将永远都是什么值,后面xxx.value的所有变动都与这个变量没有半毛钱关系.所以,到这里,响应式就被切断了!!!

案例中,使用ref创建了list为空数组,则初始化的值是空数组.紧接着写代码给listArr赋值,直接取了此时的list.value值,也就是空数组(如果初始化的时候是其他值,那么这里赋值的就是其他值)

有点绕,再多看几遍,打一打代码就懂了~

针对写法二:

我菜鸟的认为,这样一定能行,因为我是把整个响应式变量都搬过来了,按道理来说应该是可以实时获取最新的数据呀.不是说引用了地址就能时实追踪么?

答案来了~

Vue3不会自动解包嵌套在对象/数组中的ref,即使通过.value[0].arr.value完整路径访问,响应式更新也无法穿透多层结构

也就是说,Vue只能追踪到listArr.value的变化。此时就算是list更新了,也没办法感知到,这里响应式中断了!

 

那么,要怎么写才正确呢?下面是三种方法供参考,实测有效

const list = ref([]) // 方法一:使用toRef,让arr转为响应式数据
const listArr = ref([{ type: 'fuzhi', arr: toRef(list, 'value') },
])
console.log(listArr.value[0].arr.value)// 方法二:使用reactive,reactive可以解决嵌套ref响应式失效的问题
const listArr = reactive([{ type: 'fuzhi', arr: list },
])
console.log(listArr[0].arr)// 方法三:使用computed
const listArr= computed(() => [{ type: 'fuzhi', arr: list }])
console.log(listArr.value[0].arr.value)

小伙伴们可以自己找个适合自己的方法,结束结束~

http://www.gsyq.cn/news/12284.html

相关文章:

  • 【C++STL详解】带头双向循环结构 + 双向迭代器,核心接口 + 排序效率 + 避坑指南 - 教程
  • VBA ETH功能应用 | “0”代码构建SOME/IP节点
  • ISUP协议视频平台EasyCVR在智慧灯杆综合管理中的应用
  • 视觉智能赋能产业数智化升级:JBoltAI多模态技术落地实践
  • 聚焦 Java AI 开发:JBoltAI 框架支持多模型适配,打造智能应用
  • Stylus For Chrome下载地址
  • 麒麟 Linux|深入解析 Linux 文件系统架构:理念、结构与工作机制 - 教程
  • 别等碳超支才慌!EMS 像 “碳导航”,提前预警能耗 “堵点”,双碳路上不绕路
  • Halcon图像——相机图像采集模式
  • Gitee:本土化DevOps平台如何助力企业实现研发效能跃迁
  • 告别等待:5 个 systemd 优化技巧,显著加速你的 Linux 启动
  • pod启动后一直containerCreating状态解决
  • [PaperReading] REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS
  • 深入解析:【Java开发:Lambda表达式】
  • 算法第一章作业
  • 采购系统
  • PostgreSQL patroni 高可用 1:ectd 安装和配置
  • 实用指南:老题新解|素数对
  • 人文领域的创新乏力:当价值内卷遇上元人文AI的破局之光
  • [iOS] OC高级编程 - 引用计数 (1) - 详解
  • AI论文速读 | 当大语言模型遇上时间序列:大语言模型能否执行多步时间序列推理与推断 - 指南
  • unordered_map性能被吊打!我用基数树让内存池性能暴涨几十倍的秘密
  • 深入解析:TENGJUN“二合一(2.5MM+3.5MM)”耳机插座:JA10-BPD051-A;参数与材质说明
  • CentOS 9服务器版 部署Zabbix7.0 server端 - 详解
  • US$189 VVDI2 BMW FEM amp; BDC Functions Authorization Service With Ikeycutter Condor
  • 模式组合应用-享元模式 - 详解
  • Go 1.26 内置函数 new 新特性
  • 重要公式 - Emi
  • 软件构造中的数据处理(sql) 6章
  • Gitee vs. GitLab:中国开发者为何选择本土代码托管平台?