热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解Vue3中ref与reactive的差异

本文详细探讨了Vue3中ref和reactive的主要区别,包括它们在模板中的使用方式、Vue如何处理这两种数据类型以及如何判断数据类型。

在 Vue3 中,ref 和 reactive 是两种用于创建响应式数据的方法,但它们在使用上有一些重要的区别。



1. 使用上的区别


当在模板中使用 ref 类型的数据时,Vue 会自动为我们添加 .value。例如,如果你在模板中引用了一个 ref 类型的变量 age,你只需写 {{ age }},而不需要写 {{ age.value }}。这是因为 Vue 在解析模板时会自动检测数据是否为 ref 类型,并相应地处理。



相比之下,当在模板中使用 reactive 类型的数据时,Vue 不会自动添加 .value。因此,你需要手动指定 {{ age.value }} 来访问数据。这表明 reactive 类型的数据需要显式地处理其嵌套属性。



2. Vue 的内部机制


Vue 在解析数据时会检查数据是否为 ref 类型。这一过程通过检查数据的 __v_ref 属性来完成。如果该属性存在且值为 true,则认为数据是 ref 类型的,Vue 将自动为其添加 .value。如果不是 ref 类型的数据,Vue 就不会进行这种处理。



3. 示例代码


ref 类型的数据








在这个例子中,点击“修改年龄”按钮后,页面显示的年龄会变为 666。注意,模板中直接使用 {{ age }} 而不是 {{ age.value }},因为 Vue 自动处理了 .value。



reactive 类型的数据








在这个例子中,点击“修改年龄”按钮后,页面显示的年龄仍然需要通过 {{ age.value }} 访问,因为它是 reactive 类型的数据。



4. 判断数据类型


你可以使用 Vue 提供的 isRefisReactive 方法来判断一个数据是 ref 还是 reactive 类型的。








扩展知识点:Vue3 中 reactive 和 ref 的对比


数据定义角度:



  • ref 通常用于定义基本类型的数据(如数字、字符串等)。

  • reactive 用于定义复杂类型的数据(如对象、数组等)。

  • 虽然 ref 也可以定义对象或数组类型的数据,但它内部会自动通过 reactive 转换为代理对象。



原理角度:



  • ref 通过 Object.defineProperty() 的 get 和 set 方法实现响应式。

  • reactive 通过 Proxy 实现响应式,并利用 Reflect 操作源对象内部的数据。



使用角度:



  • ref 定义的数据:操作数据需要使用 .value,但在模板中直接读取数据时不需要 .value

  • reactive 定义的数据:无论是操作数据还是读取数据,均不需要使用 .value


推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 深入理解Java泛型:JDK 5的新特性
    本文详细介绍了Java泛型的概念及其在JDK 5中的应用,通过具体代码示例解释了泛型的引入、作用和优势。同时,探讨了泛型类、泛型方法和泛型接口的实现,并深入讲解了通配符的使用。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
author-avatar
打工仔成军军
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有