当前位置: 首页 > 知识库问答 >
问题:

前端 - vue3 reactive() 的局限性:对解构操作不友好,ref似乎也有这个问题?

季阳朔
2023-11-19

https://cn.vuejs.org/guide/essentials/reactivity-fundamentals...

https://play.vuejs.org/#eNp9UcFuwjAM/ZUoF4qoShE3VJC2iQM7bNO2Y...

如代码所示,解构丢失响应性连接似乎并不只是reactive的“局限性”

共有2个答案

顾高扬
2023-11-19

reactive() 的话可用利用 toRefs() 方法转换为 ref 变量构成的对象从而使用结构赋值,参见 https://vuejs.org/api/reactivity-utilities.html#torefs 以及官方的示例

const state = reactive({  foo: 1,  bar: 2})const { foo, bar } = toRefs(state)// The ref and the original property is "linked"state.foo++console.log(foo.value) // 2foo.value++console.log(state.foo) // 3
巫马俊力
2023-11-19

对,你提到的这个问题不仅限于reactive(),包括ref()在内的一些Vue3的反应性API在处理解构时都有一定的问题。

Vue3 的反应性系统在处理解构操作时,无法跟踪解构的子属性变化。例如,如果你有一个对象,并且使用reactive()对其进行了反应性处理,然后通过解构来访问其属性,那么当这些属性发生改变时,Vue3的反应性系统无法跟踪这些变化。

以下是一个例子:

import { reactive } from 'vue'const state = reactive({  obj: {    value: 1,  },})const otherState = { ...state.obj } // 解构操作

在这个例子中,otherState 是从 state.obj 中解构出来的,然而它并不会保持与 state.obj 的反应性连接。如果 state.obj.value 改变,otherState.value 不会更新。

这个问题的根源在于 Vue3 的反应性系统只能跟踪通过反应性对象直接导出的属性,而无法跟踪通过解构得到的属性。对于这种情况,你需要手动使用 ref() 来创建反应性引用。例如:

import { reactive, ref } from 'vue'const state = reactive({  obj: {    value: ref(1), // 使用ref来创建反应性引用  },})const otherState = { ...state.obj } // 解构操作

在这个例子中,即使 state.obj.value 改变,otherState.value 也会更新,因为 state.obj.value 是一个反应性引用。

 类似资料:
  • 受这个问题的启发,我开始研究有序流与无序流、并行流与顺序流以及终端操作,它们考虑的是相遇顺序,而终端操作则不考虑相遇顺序。 在链接问题的一个答案中,显示了一个类似于此的代码: 名单确实不同。列表甚至从一次运行更改到另一次运行,表明结果实际上是不确定的。 因此,我创建了另一个示例: 我希望看到类似的结果,因为流既并行又无序(可能是冗余的,因为它已经并行了)。但是,结果列表是有序的,即它等于源列表。

  • 我有一个工作流,它执行一系列模糊测试,最后计算所有崩溃程序子目录中的文件总数。后来,在另一份工作中,我使用该号码向Slack发送通知。但是,由于某些原因,不会产生任何输出,最重要的是,即使崩溃程序的数量不是零,下一个作业也不会运行! 有人知道我做错了什么吗?谢谢!

  • 当我用刻度2ROUND_HALF_UP10.12445时,我希望得到10.13,因为10.12445- 因此,如果我成功地用4、3和2级进行四舍五入,我会得到预期的结果: 我错过什么了吗? 有没有办法直接得到我期望的结果?

  • 当我将输入类型属性设置为数字(Android:输入类型=“数字”)并设置数字属性时,就像这个Android:数字=“0123456789”。输入事件按预期正常工作。即仅以数字形式接收输入。参考屏幕截图 当我将inputType属性设置为text person name(Android:input type = " text person name ")并像这样设置digits属性android:d

  • 我的代码看起来像 我的文件如下所示 当我运行程序时,我看到 我怎样才能修好它呢?

  • https://blog.csdn.net/chouhui0263/article/details/100744275 这里面提到了一点: key作为数据分区的最小粒度读,因此不能将一个大的键值对象如hash、list等映射到不同的节点。 问题: 1.什么情况下 一个大的键值对象如hash、list等 会 映射到 不同的节点? 2.我的理解,redis中的hash命令是 hset hashKey