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 }}

相关文章
|
JavaScript 前端开发
49dwr - 传递额外的数据到 callback 函数
49dwr - 传递额外的数据到 callback 函数
44 0
|
7月前
|
前端开发 JavaScript
ajax框架格式,每个属性的作用
ajax框架格式,每个属性的作用
45 7
|
7月前
|
安全 Swift
Swift 语言:什么是可选类型(Optional)?如何处理可选类型的安全解包?
Swift的可选类型是处理值可能缺失的类,用?表示。它们能表示有值或无值状态。安全解包用`if let`或`guard let`避免崩溃,而强制解包`!`则风险较高,若值为`nil`会触发运行时错误。
53 0
|
存储 JavaScript 前端开发
Symbol从基础到原理,再到应用!
Symbol对于一些前端小白(比如我)来讲,没有特别使用过,只是在学习JS的时候了解了大概的概念,当时学习可能并没有感觉到Symbol在开发中有什么特别的作用,而在学习一段时间后回头看一遍,顿悟!
274 0
C#基础⑧——方法(函数、重载、out、ref)
比喻成职能。比喻成一个生产自行车老板,一个地方专门放螺丝,一个地方专门放轮,一个地方专门放车链子,需要组装什么就从那个仓库里面拿就行了。各司其职。
|
Python
【Python零基础入门篇 · 12】:函数的定义和作用、函数参数、函数嵌套、枚举函数enumerate
【Python零基础入门篇 · 12】:函数的定义和作用、函数参数、函数嵌套、枚举函数enumerate
147 0
【Python零基础入门篇 · 12】:函数的定义和作用、函数参数、函数嵌套、枚举函数enumerate
|
XML 前端开发 数据格式
使用 ES6 的展开运算符简化传递 props 数据的过程|学习笔记
快速学习使用 ES6 的展开运算符简化传递 props 数据的过程
142 0
使用 ES6 的展开运算符简化传递 props 数据的过程|学习笔记
|
Python
【Python零基础入门篇 · 9】:函数的定义和作用、函数参数、函数嵌套、枚举函数enumerate
【Python零基础入门篇 · 9】:函数的定义和作用、函数参数、函数嵌套、枚举函数enumerate
119 0
【Python零基础入门篇 · 9】:函数的定义和作用、函数参数、函数嵌套、枚举函数enumerate
|
XML 数据格式
使用ES6的展开运算符简化传递props数据的过程
使用ES6的展开运算符简化传递props数据的过程
使用ES6的展开运算符简化传递props数据的过程
ES6中 Symbol 的基础学习,迭代器和生成器的基本用法
迭代器为所有数据结构提供了统一的访问机制。只要为数据结构部署了接口,就可以进行遍历操作。
137 0