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

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

错误写法一:

// 动态获取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)

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

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

  1. for循环的运算 改变循环的控制流 死循环 遍历数组 定义方法 有名函数匿名函数 定义函数的方法取值 与 自己创建函数取值 局部与全局变量 次幂/随机数/取绝对值/向上取整/平方根

    今天学习的是for循环,对for循环的运算有了理解. document.write(" ")里的内容在网页上展示出来 有名函数非常重要!!!!!!!!!!!!!!!!!!!!!并且 ...

  2. jquery中定义数组并给数组赋值后转为json格式为[]问题的解决

    一.问题描述:jquery定义一个空数组,并赋值,结果转为json格式后打印值为空 我原本是这样写的,但是show_data值一直为[] var export_data = [];export_dat ...

  3. vue3项目一些小坑

    文章来自 https://mp.weixin.qq.com/s/nJsfOUNNKYQdvB9o9BXVVQ 1. Vue2.x 和 Vue3.x 生命周期方法的变化 文档地址:https://v3. ...

  4. go的变量redeclare的问题,golang的一个小坑

    go的变量声明有几种方式: 1 通过关键字 var 进行声明 例如:var i int   然后进行赋值操作 i = 5 2 最简单的,通过符号 := 进行声明和赋值 例如: i:=5 golang会 ...

  5. Angular测试遇到的小坑

    Angular测试遇到的小坑 Error: Expected to be running in 'ProxyZone', but it was not found 检查doneFn的写法是否正确,位置 ...

  6. JavaScript的兼容小坑和调试小技巧

    JavaScript作为一种弱类型编程语言,入门简单,只要稍微注意一下IE方面的兼容性,就可以很好的使用它. 本文主要是对IE兼容的小坑和调试的小技巧进行举例分析,并给出解决方法. 1.var str ...

  7. 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    [手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...

  8. 7个Python小坑,给新手党的福利

    Python语言简单易用,但容易给新入门的朋友造成一些微妙的,难以捕捉的错误,稍不注意就入坑了. 因此,今天给大家总结一些易犯的小错误,让你轻松进行不踩坑的Python学习. 1.缩进,符号和空格不正 ...

  9. python中关于传递参数模块argprase的一些小坑

    今天在写代码的时候遇到了一个关于parser的一些小坑,记录在此备用. 我们知道在python中可以用argprase来传递一些参数给代码执行,来看下面的例子,假设现在有一个test文件夹,下面有3个 ...

  10. Python中需要注意的一些小坑

    Python小知识 # a = a + b /a += b 有时是不一样的​ a=[1,2,3] b = a a = a + [4,5,6] ​ # a=[1,2,3] # b = a # a += ...

随机推荐

  1. c#文件压缩,需要借助外部dll文件和ZipHelper.cs

    后台代码 ZipHelper z = new ZipHelper(); List<string> pathList=new List<string> (); pathList. ...

  2. 01EDA简介

    EDA工具简介 (Electronic Design Automation) 目录 EDA工具简介 目录 1. EDA概述 1.1 什么是EDA? 1.2 EDA工具的分类 1.3 EDA设计流程 2 ...

  3. jenkins部署完微信推送

    前言 我需要一款使用简单方便: 支持微信.企业微信.短信.邮件等通知: 消息多样化,支持markdown等格式消息: 支持消息存储: 免费使用: 于是我找到了一款插件.目前还是免费pushplus. ...

  4. 03数字ic综合文件内部对象

    数字IC综合中的内部对象深度解析 目录 1. 概述 ️ 2. 设计对象体系结构 3. 核心对象详解 4. 对象获取与操作 5. 高级对象操作技巧 6. 实战应用案例 7. 最佳实践与注意事项 1. 概 ...

  5. Datawhale AI夏令营-学习笔记(一)

    大数据相关知识: 文本编码:将人类可读的文本转换为机器可理解的数值向量表示,这是所有文本分析任务的基础. 常用方法包括独热编码.词嵌入 (如Word2Vec.GloVe等静态词向量)以及基于预训练模型 ...

  6. BIO 和 NIO AIO

    简介 BIO Blocking IO 阻塞IO 简单来说, 就是服务器对每一个接收数据请求, 开启一个线程进行对于数据和逻辑的处理, 但是能创建的线程数量有限. 很多处理逻辑开启的线程处于阻塞状态. ...

  7. 通过ETL工具快速实现单据同步

    ETLCloud介绍 ETLCloud是一款旨在解决企业数据集成挑战的最新一代平台,它集成了离线数据集成ETL.ELT.CDC实时数据集成.编排调度和数据服务API等功能,形成了一体化的DataOps ...

  8. POLIR-Laws-诉讼法: 判断注册公司是否有独立法人资格? + 集团客户/母公司/子公司/分公司 + 和分公司发生纠纷,如何一并起诉总公司?

    POLIR-Laws-诉讼法: 和分公司发生纠纷,如何一并起诉总公司? 判断注册公司是否有独立的"法人资格"? 法人企业与非法人企业有什么区别 一.定义上的区别: 法人企业: 是指 ...

  9. SciTech-EECS-Devices-Phone: 拆机短接进入 CPU产商提供的 "紧急修复模式":高通9008端口模式(EDL Mode)+

    刷机常识: 拆机+短接进入CPU产商的紧急修复模式: 高通9008端口模式(EDL Mode) 关于短接测试点的 什么是测试点? 手机的测试点是在手机主板上特意设置的特定位置, 在手机生产测试.维修以 ...

  10. SciTech-Mathmatics-等比数列n项加总公式 + 三角函数Trigonometric Identities you must remember: 需要记住的三角函数

    $\large S_n = a_1 \cdot \frac{1-q^n}{1-q}=\frac{a_1-a_n \cdot q}{1-q},\ when\ q \neq 1 \ and\ a_1 \n ...