ref 解包细节

作为 reactive 对象的属性

一个 ref 会在作为响应式对象的属性被访问或修改时自动解包。换句话说,它的行为就像一个普通的属性:

const count = ref(0)
const state = reactive({
  count
})

console.log(state.count) // 0

state.count = 1
console.log(count.value) // 1

如果将一个新的 ref 赋值给一个关联了已有 ref 的属性,那么它会替换掉旧的 ref:

const otherCount = ref(2)

state.count = otherCount
console.log(state.count) // 2
// 原始 ref 现在已经和 state.count 失去联系
console.log(count.value) // 1

只有当嵌套在一个深层响应式对象内时,才会发生 ref 解包。当其作为浅层响应式对象的属性被访问时不会解包。

数组和集合的注意事项

与 reactive 对象不同的是,当 ref 作为响应式数组或原生集合类型 (如 Map) 中的元素被访问时,它不会被解包:

const books = reactive([ref('Vue 3 Guide')])
// 这里需要 .value
console.log(books[0].value)

const map = reactive(new Map([['count', ref(0)]]))
// 这里需要 .value
console.log(map.get('count').value)

 

在模板中解包的注意事项

在模板渲染上下文中,只有顶级的 ref 属性才会被解包。

在下面的例子中,count 和 object 是顶级属性,但 object.id 不是:

const count = ref(0)
const object = { id: ref(1) }

因此,这个表达式按预期工作:

{{ count + 1 }}

...但这个不会

{{ object.id + 1 }}

渲染的结果将是 [object Object]1,因为在计算表达式时 object.id 没有被解包,仍然是一个 ref 对象。为了解决这个问题,我们可以将 id 解构为一个顶级属性:

const { id } = object
{{ id + 1 }}

现在渲染的结果将是 2

另一个需要注意的点是,如果 ref 是文本插值的最终计算值 (即 {{ }} 标签),那么它将被解包,因此以下内容将渲染为 1

{{ object.id }}

该特性仅仅是文本插值的一个便利特性,等价于 {{ object.id.value }}

相关推荐

  1. ref 细节

    2024-03-27 09:24:09       42 阅读
  2. Python语法

    2024-03-27 09:24:09       23 阅读
  3. 扫雷/python中*作用

    2024-03-27 09:24:09       62 阅读
  4. jar.exe压缩jar

    2024-03-27 09:24:09       46 阅读
  5. Linux之tar打包命令

    2024-03-27 09:24:09       25 阅读
  6. Python实现压缩

    2024-03-27 09:24:09       21 阅读
  7. uniapp打小程序,使用$refs报错解决办法

    2024-03-27 09:24:09       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 09:24:09       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 09:24:09       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 09:24:09       87 阅读
  4. Python语言-面向对象

    2024-03-27 09:24:09       96 阅读

热门阅读

  1. VUE3——Proxy API 与VUE2——defineProperty API区别

    2024-03-27 09:24:09       39 阅读
  2. ubuntu开启ssh服务

    2024-03-27 09:24:09       40 阅读
  3. leetcode66-Plus One

    2024-03-27 09:24:09       34 阅读
  4. Docker in Docker(DinD)浅析

    2024-03-27 09:24:09       39 阅读
  5. STM32 库函数 3*4矩阵键盘

    2024-03-27 09:24:09       40 阅读
  6. Hive安装配置

    2024-03-27 09:24:09       34 阅读
  7. php获取文件列表(所有子目录文件)

    2024-03-27 09:24:09       44 阅读
  8. Docker搭建Etcd集群

    2024-03-27 09:24:09       45 阅读
  9. Spring Boot设置io临时目录

    2024-03-27 09:24:09       36 阅读
  10. go实现链表

    2024-03-27 09:24:09       38 阅读
  11. 计算机网络——网络基础1

    2024-03-27 09:24:09       40 阅读
  12. vue3 之 Pinia

    2024-03-27 09:24:09       35 阅读
  13. 第三十三章 配置服务器访问 - SSL TLS 参数

    2024-03-27 09:24:09       37 阅读
  14. React组件如何通信

    2024-03-27 09:24:09       40 阅读