ref 解包细节

简介: 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 属性才会被解包。

在下面的例子中,countobject 是顶级属性,但 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 }}

相关文章
|
8月前
|
存储 C++
[Eigen中文文档] 原始缓冲区接口:Map 类
本节解释了如何使用“原始”C/C++ 数组。这在各种情况下都很有用,特别是在将向量和矩阵从其他库“导入”到 Eigen 中时。
82 0
|
11月前
|
JSON 数据格式 Python
24.从入门到精通:__name__属性 dir() 函数 标准模块 包 从一个包中导入*
24.从入门到精通:__name__属性 dir() 函数 标准模块 包 从一个包中导入*
|
算法 C++ Python
师父给了我一个 .proto 文件,我应该怎么使用?
师父给了我一个 .proto 文件,我应该怎么使用?
136 0
|
Python
Python def定义函数并进行序列解包源码操作解析
Python def定义函数并进行序列解包源码操作解析
69 0
|
前端开发 JavaScript
简单手写实现函数组件的Ref - forwardRef
简单手写实现函数组件的Ref - forwardRef
143 0
lodash解析对象属性路径的值
lodash解析对象属性路径的值
141 0
|
Scala 开发者
包对象注意事项和细节说明|学习笔记
快速学习包对象注意事项和细节说明。
51 0
包对象注意事项和细节说明|学习笔记
|
开发者 Python
参数解包|学习笔记
快速学习 参数解包
124 0
|
监控 Go
golang的filepath包的几个函数的细微区别
Clean(),Dir(),ABS()配合Walk()使用的时候,由于前三个函数返回值的细微差别,会造成遍历目录的时候,得到的结果不一样.filepath.Abs("./myDoc")//返回所给路径的绝对路径这时候遍历没有问题, 2019/06/12 10:50:31 监控 : 1, D:\wo...
962 0
|
C++
const的用法,特别是用在函数前面与后面的区别
转自:https://www.cnblogs.com/azbane/p/7266747.html   在普通的非 const成员函数中,this的类型是一个指向类类型的 const指针。
936 0