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 API
React开发需要了解的10个库
本文首发于微信公众号“前端徐徐”,介绍了React及其常用库。React是由Meta开发的JavaScript库,用于构建动态用户界面,广泛应用于Facebook、Instagram等知名网站。文章详细讲解了Axios、Formik、React Helmet、React-Redux、React Router DOM、Dotenv、ESLint、Storybook、Framer Motion和React Bootstrap等库的使用方法和应用场景,帮助开发者提升开发效率和代码质量。
545 4
React开发需要了解的10个库
|
9月前
|
域名解析 网络协议 Linux
localhost 和 127.0.0.1 到底有啥区别?
`localhost` 和 `127.0.0.1` 是开发中常用的本地测试工具,它们虽常互换使用,但存在本质区别。本文深入解析两者定义、特点及差异:`localhost` 为域名,需解析为 IP(如 `127.0.0.1` 或 IPv6 的 `::1`),更灵活;`127.0.0.1` 是固定 IPv4 回环地址,解析更快。文章还探讨了特殊场景下的表现差异,并给出开发中的选择建议,助你更好地理解与应用。
1517 0
|
人工智能 物联网 PyTorch
ChatTTSPlus:开源文本转语音工具,支持语音克隆,是 ChatTTS 的扩展版本
ChatTTSPlus 是一个开源的文本转语音工具,是 ChatTTS 的扩展版本,支持语音克隆、TensorRT 加速和移动模型部署等功能,极大地提升了语音合成的性能和灵活性。
1135 5
ChatTTSPlus:开源文本转语音工具,支持语音克隆,是 ChatTTS 的扩展版本
|
编译器 API UED
Galacean Engine 1.3 发布
经历了三个月的研发,我们激动地向您介绍全新的 Galacean Engine 1.3 版本 🎉 此次更新不仅包含后处理、Prefab、动画状态机、高级材质等多项新功能,更在稳定性、性能和用户体验上进行了一大波优化。我们还在编辑器中内置了大量的案例模板,方便用户快速学习和预览功能效果。此外,Galacean Engine 官网设计也进行了全面更新,为您带来更棒的浏览体验!
403 0
|
JavaScript IDE 开发工具
找不到模块“./App.vue”或其相应的类型声明。ts(2307)
这篇文章介绍了在Vue 3 + TypeScript + Vite开发环境中解决找不到`.vue`文件模块或其类型声明错误的两种方法:使用VSCode的TypeScript Vue Plugin (Volar)插件或手动在`env.d.ts`文件中声明`*.vue`模块类型。
2932 1
找不到模块“./App.vue”或其相应的类型声明。ts(2307)
|
Java 测试技术
Java实现自动贩卖机/售货机
Java实现自动贩卖机/售货机
1435 0
Java实现自动贩卖机/售货机
|
Java Scala Kotlin
SpringBoot中@Async的实现方式探索
本文探讨了一段重写了默认`@Async`线程处理的Scala代码,并对其目的与必要性提出了疑问。原代码通过自定义`AsyncExecutorConfig`类,实现了`AsyncConfigurerSupport`接口,进而配置了一个`ThreadPoolExecutor`作为异步任务的执行器。文章随后分析了为何要替换默认实现,并对Spring框架中`@Async`注解的默认行为进行了深入研究。
271 0
|
XML JSON 前端开发
前端 JS 经典:Content-type 详解
前端 JS 经典:Content-type 详解
1378 0
|
Web App开发 JavaScript 前端开发
正确开启vue3.0调试工具vue-devtools
正确开启vue3.0调试工具vue-devtools
6565 2

热门文章

最新文章