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

news/2025/9/26 14:36:54/文章来源:https://www.cnblogs.com/liandudu/p/19113450

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

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

错误写法一:

// 动态获取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.mzph.cn/news/918400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二类斯特林数

定义 第二类斯特林数记作 \(\begin{Bmatrix}n\\ k\end{Bmatrix}\) 或者 \(S(n,k)\),其意义是将 \(n\) 个互不相同的元素划分为 \(k\) 个相同的非空集合的方案数。 朴素求解 \[\begin{Bmatrix}n\\ k\end{Bmatrix} =\be…

扫码签到赢大奖小程序:助力多场景获客的智能营销工具

在数字化营销浪潮下,线下场景的流量激活与用户留存成为商家核心需求。由厦门掌界网络开发的 “扫码签到赢大奖” 小程序,依托微信生态,以 “签到 + 抽奖” 为核心模式,为门店、景区、展会等场景提供低成本、高效率…

seo基础入门汉中网站seo

公司里绝大多数主机已经禁止外网访问,仅保留一台主机设置socks作为代理服务器。如下为对socks这一概念的学习整理 什么是socks 是一种OSI模型下会话层的协议,位于表示层与传输层之间,作用是: exchanges network packets between…

贵阳建站推广公司蜘蛛搜索引擎

字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题。这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助。 还是得从ASCII码说起 说到字符编码,不得不说ASCII码的简史。计算机一开始发明…

庐江魅力网做网站号码成都网站开发

物理建模是四旋翼无人机控制系统建模的基础,主要涉及到无人机的物理特性和运动学特性。物理建模的目的是将无人机的运动与输入信号(如控制电压)之间的关系进行数学描述。 四旋翼无人直升机是具有四个输入力和六个坐标输出的欠驱动动力学旋翼…

做网站时,404网页如何指向wordpress weather

Java中的适配器模式(Adapter Pattern)是一种设计模式,它允许我们将一种类的接口转换成另一种类的接口,以便于使用。适配器模式通常用于在不兼容的接口之间提供一种过渡性的接口,从而使代码更加灵活和可维护。 在Java中…

包装盒在线设计网站二级子域名ip地址查询

http和https区别 HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是用于在网络上传输数据的两种协议。它们之间的主要区别在于安全性和数据传输方式: 安全性:HTTP是明文传…

docker 镜像/容器

根据镜像启动容器,并进入容器: docker run -it --privileged --entrypoint bash 镜像名特性Docker 镜像Docker 容器本质 只读的模板或快照。包含创建容器所需的文件和元数据。 镜像的运行实例。是一个可写的、隔离的…

jmeter命令行参数详细解释

1. 帮助与版本信息 -h, --help: 显示 JMeter 的使用帮助信息并退出程序 -v, --version: 显示 JMeter 的版本信息并退出程序2. 配置文件相关 -p, --propfile <argument>: 指定 JMeter 要使用的属性文件 -q, --add…

RK3399:性能与能效的嵌入式先锋,解锁多场景应用潜力

在寻求卓越性能与出色能效平衡的嵌入式计算和智能设备领域,瑞芯微(Rockchip)推出的 RK3399 处理器无疑是一个耀眼的明星。这款基于ARM架构的旗舰级SoC(System-on-Chip),凭借其强大的六核CPU、优秀的图形处理能力…

【C++STL详解】带头双向循环结构 + 双向迭代器,核心接口 + 排序效率 + 避坑指南 - 教程

【C++STL详解】带头双向循环结构 + 双向迭代器,核心接口 + 排序效率 + 避坑指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…

学做视频的网站有哪些window7用jsp做的网站要什么工具

距离vue3.3发布已经过了一年多(2023.5.11),vue3.3提高开发体验的新特性你用了吗&#xff1f; 组件内部导入复杂类型 3.3之前想在组件内部导入复杂类型做props类型是不支持的。 <script setup lang"ts">import type { People } from /types;withDefaults(define…

Node.js后端学习笔记:Express+MySQL - 指南

Node.js后端学习笔记:Express+MySQL - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

TorchV知识库安全解决方案:基于智能环境感知的动态权限控制

TorchV知识库安全解决方案:基于智能环境感知的动态权限控制在数据即资产的时代,企业知识库的安全不再仅限于“用户名和密码”。TorchV带来的是一种全新的安全范式——让环境成为新的安全边界。————TorchV舒一笑不…

详细介绍:Java HTTP协议(二)--- HTTPS,Tomcat

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

VBA ETH功能应用 | “0”代码构建SOME/IP节点

在智能汽车飞速发展的今天,车载以太网通信已成为功能服务化的核心驱动力。工程师在控制器开发、通信集成和测试验证中,常常面临SOMEIP协议交互的复杂挑战:SD过程繁琐、SessionID等字段具有变化逻辑、纯手动构造二层…

ISUP协议视频平台EasyCVR在智慧灯杆综合管理中的应用

ISUP协议视频平台EasyCVR在智慧灯杆综合管理中的应用智慧城市的迅猛发展带动了智慧灯杆综合管理平台的兴起,平台作为城市基础设施智能化的关键组成部分,日益彰显其在城市管理和公共服务领域的显著优势。通过整合多样…

视觉智能赋能产业数智化升级:JBoltAI多模态技术落地实践

视觉智能赋能产业数智化升级:JBoltAI多模态技术落地实践一、多模态技术:企业数智化转型的新引擎当前,全球产业正面临着一个共同挑战:如何将海量的非结构化数据转化为可操作的商业智能。传统企业系统中,大量信息以…

神秘考试题

题意 有一个长度为 \(n\) 的序列 \(a\),你需要求出: \[\sum_{i = 1}^n \sum_{j = 1}^n (a_i \text{and} a_j)(a_i \text{or} a_j)(a_i \text{xor} a_j) \]solution 首先对于每个结果拆位,也就是对于原式中的三项,我…