Vue3中响应式Reactive的独特之处:它在哪些场景下胜出Ref?

news2024/10/7 10:24:54

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3

文章目录

    • 一、Vue 3中响应式Reactive的独特之处
      • 1.1 引言
      • 1.2 Vue 3中的响应式系统简介
    • 二、Vue 3中的Reactive
      • 2.1 使用Reactive创建响应式数据
        • 2.1.1 创建简单的响应式数据
        • 2.1.2 创建嵌套的响应式数据
      • 2.2 响应式数据的特性
        • 2.2.1 响应式数据的自动依赖追踪
        • 2.2.2 响应式数据的惰性求值
        • 2.2.3 响应式数据的深层监听
        • 2.2.4 响应式数据的批量更新
      • 2.3 响应式数据的局限性
        • 2.3.1 响应式数据的增删操作
        • 2.3.2 响应式数据的性能考虑
    • 三、Vue 3中的Ref
      • 3.1 使用Ref创建响应式数据
        • 3.1.1 创建简单的响应式数据
        • 3.1.2 创建包装对象的响应式数据
      • 3.2 Ref与Reactive的对比
        • 3.2.1 响应式数据的类型转换
        • 3.2.2 响应式数据的访问方式
        • 3.2.3 响应式数据的内部实现
    • 四、Reactive与Ref的应用场景
      • 4.1 Reactive的应用场景
        • 4.1.1 复杂数据结构的响应式管理
        • 4.1.2 需要深层监听的数据
        • 4.1.3 自定义的响应式逻辑
      • 4.2 Ref的应用场景
        • 4.2.1 简单数据类型的响应式管理
        • 4.2.2 对象的单一属性的响应式管理
        • 4.2.3 在模板中使用Ref
    • 五、总结
      • 5.1 Reactive与Ref的对比与选择

一、Vue 3中响应式Reactive的独特之处

1.1 引言

在Vue 3中,响应式系统是Vue的核心特性之一。它通过Reactive和Ref这两种方式来处理响应式数据,为开发者提供了便利的数据管理和自动更新的能力。本文将重点介绍Vue 3中Reactive的独特之处以及与Ref的对比。

1.2 Vue 3中的响应式系统简介

Vue 3的响应式系统基于Proxy代理对象实现,它能够自动追踪数据的依赖关系,并在数据变化时自动更新相关的视图。Vue 3的响应式系统具有以下特点:

  • 自动依赖追踪:当访问响应式数据时,Vue 3会自动追踪该数据的依赖关系,建立起一个依赖图谱。
  • 惰性求值:响应式数据只有在真正需要访问时才会进行求值和依赖追踪,从而提高性能。
  • 深层监听:Vue 3的响应式系统支持对嵌套对象或数组中的属性进行深层监听,使得处理复杂数据结构更加便捷。
  • 批量更新:Vue 3通过批量更新机制优化性能,将对同一个响应式对象的多次修改合并为一次更新。

二、Vue 3中的Reactive

2.1 使用Reactive创建响应式数据

2.1.1 创建简单的响应式数据

在Vue 3中,可以使用reactive函数将普通的JavaScript对象转换为响应式数据。以下是一个示例:

import { reactive } from 'vue'

const state = reactive({
  count: 0,
  message: 'Hello, Vue 3!'
})

在上述示例中,我们使用reactive函数将一个普通的对象转换为响应式数据state。现在,state对象的countmessage属性具有响应性,任何对它们的修改都会自动触发相关的更新。

2.1.2 创建嵌套的响应式数据

除了简单的对象,reactive函数还可以处理嵌套的对象和数组。以下是一个示例:

import { reactive } from 'vue'

const nestedState = reactive({
  user: {
    name: 'John',
    age: 25
  },
  todos: [
    { id: 1, text: 'Learn Vue 3', done: false },
    { id: 2, text: 'Build an app', done: true }
  ]
})

在上述示例中,我们使用reactive函数将一个包含嵌套对象和数组的普通对象转换为响应式数据nestedState。现在,nestedState对象的user属性和todos属性以及它们内部的属性都具有响应性。

2.2 响应式数据的特性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mgkv43aT-1684730430645)(/Users/chenshuyu/Library/Application Support/typora-user-images/image-20230522123813462.png)]

2.2.1 响应式数据的自动依赖追踪

在Vue 3中,当访问响应式数据时,系统会自动追踪该数据的依赖关系。这意味着,当响应式数据发生变化时,依赖于该数据的相关部分会自动更新。例如,以下示例展示了依赖追踪的效果:

import { reactive, watchEffect } from 'vue'

const state = reactive({
  count: 0,
  double: 0
})

watchEffect(() => {
  state.double = state.count * 2
})

state.count = 5 // 触发依赖更新,state.double的值将自动更新为10

在上述示例中,我们使用watchEffect函数创建了一个响应式的副作用函数。该函数依赖于state.count,并在state.count发生变化时更新state.double的值。

2.2.2 响应式数据的惰性求值

Vue 3的响应式系统采用惰性求值的策略,只有在真正需要访问响应式数据时才会进行求值和依赖追踪。这意味着,当响应式数据在某些条件下不被访问时,不会触发不必要的求值和更新。这种策略有助于提高性能和减少不必要的计算。

2.2.3 响应式数据的深层监听

Vue 3的响应式系统支持对嵌套对象或数组中的属性进行深层监听。这意味着,在修改嵌套对象或数组中的属性时,系统会自动追踪并更新相关的依赖关系。以下示例展示了深层监听的效果:

import { reactive, watchEffect } from 'vue'

const nestedState = reactive({
  user: {
    name: 'John',
    age: 25
  }
})

watchEffect(() => {
  console.log(nestedState.user.name)
})

nestedState.user.name = 'Alice' // 输出 'Alice'

在上述示例中,我们创建了一个嵌套对象nestedState,并在watchEffect函数中监听nestedState.user.name的变化。当修改nestedState.user.name时,系统会自动触发依赖更新并输出新的值。

2.2.4 响应式数据的批量更新

Vue 3的响应式系统通过批量更新机制优化性能。当多次对同一个响应式对象进行修改时,系统会将这些修改合并为一次更新,从而减少不必要的更新操作。这种批量更新机制可以提高性能并减少界面的闪烁。

2.3 响应式数据的局限性

2.3.1 响应式数据的增删操作

由于Vue 3的响应式系统是基于Proxy实现的,它对于属性的增删操作并不是响应式的。这意味着,当直接对响应式对象进行属性的增删操作时,不会触发相关的更新。为了解决这个问题,Vue 3提供了一些API,如Vue.setVue.delete,用于操作响应式对象的属性。

2.3.2 响应式数据的性能考虑

尽管Vue 3的响应式系统在大多数情况下都能提供良好的性能,但在处理大规模数据和复杂数据结构时,需要注意性能方面的考虑。深层嵌套的对象和数组会增加响应式系统的追踪和更新的开销,可能导致性能下降。在这种情况下,可以考虑使用Ref来处理简单的数据类型或单一属性,以提高性能。

三、Vue 3中的Ref

3.1 使用Ref创建响应式数据

3.1.1 创建简单的响应式数据

在Vue 3中,可以使用ref函数创建一个包装对象,将普通的数据类型转换为响应式数据。以下是一个示例:

import { ref } from 'vue'

const count = ref(0)

在上述示例中,我们使用ref函数将数字0转换为响应式数据count。现在,count具有响应性,并可以在模板中直接使用。

3.1.2 创建包装对象的响应式数据

除了简单的数据类型,ref函数还可以创建包装对象的响应式数据。以下是一个示例:

import { ref } from 'vue'

const user = ref({
  name: 'John',
  age: 25
})

在上述示例中,我们使用ref函数将一个包含nameage属性的对象转换为响应式数据user。现在,user对象以及它的属性都具有响应性。

3.2 Ref与Reactive的对比

3.2.1 响应式数据的类型转换

Ref创建的响应式数据是一个包装对象,它将原始的数据类型包装在内部,并提供了.value属性来访问和修改值。而Reactive创建的响应式数据是一个响应式的普通对象。

3.2.2 响应式数据的访问方式

Ref创建的响应式数据需要通过.value属性来访问和修改值,而Reactive创建的响应式数据可以直接访问和修改对象的属性。

3.2.3 响应式数据的内部实现

Ref创建的响应式数据是通过Proxy代理对象实现的,而Reactive创建的响应式数据是通过递归遍历对象并使用Proxy代理对象实现的。

四、Reactive与Ref的应用场景

4.1 Reactive的应用场景

4.1.1 复杂数据结构的响应式管理

Reactive适用于处理复杂的数据结构,如嵌套的对象和数组。它可以方便地追踪和更新嵌套数据的变化。

4.1.2 需要深层监听的数据

如果需要对嵌套对象或数组中的属性进行深层监听,Reactive是更好的选择。它能够自动追踪嵌套属性的依赖关系,并在属性变化时自动更新。

4.1.3 自定义的响应式逻辑

Reactive还可以用于自定义的响应式逻辑。通过在getter或setter中添加自定义的逻辑,可以实现更复杂的数据处理和依赖追踪。

4.2 Ref的应用场景

4.2.1 简单数据类型的响应式管理

Ref适用于处理简单的数据类型,如数字、字符串等。它提供了更直接的访问和修改方式,无需使用.value属性。

4.2.2 对象的单一属性的响应式管理

如果只需要对对象的单一属性进行响应式管理,而不需要追踪整个对象的变化,Ref是更合适的选择。

4.2.3 在模板中使用Ref

Ref创建的响应式数据可以直接在模板中使用,而Reactive创建的响应式数据需要通过.value属性来访问。

五、总结

5.1 Reactive与Ref的对比与选择

在Vue 3中,Reactive和Ref是处理响应式数据的两种方式。Reactive适用于处理复杂的数据结构和需要深层监听的数据,而Ref适用于处理简单的数据类型和对象的单一属性。根据具体的应用场景和需求,选择合适的方式可以更好地管理和使用响应式数据。

特性ReactiveRef
类型转换普通对象包装对象
访问方式对象属性.value
内部实现ProxyProxy
响应式管理复杂数据简单数据
深层监听支持不支持
自定义逻辑支持不支持
在模板中使用需要直接使用

以上表格对比了Reactive和Ref的特性,包括类型转换、访问方式、内部实现、响应式管理、深层监听、自定义逻辑和在模板中使用等方面的差异。根据这些特性,可以根据具体的需求选择合适的方式来处理响应式数据。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法leetcode|51. N 皇后(rust重拳出击)

文章目录 51. N 皇后:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 51. N 皇后: 按照国际象棋的规则,皇后可以…

详解c++STL—STL常用算法

目录 1、常用遍历算法 1.1、for_each 1.2、transform 2、常用查找算法 2.1、find 2.2、find_if 2.3、adjacent_find 2.4、binary_search 2.5、count 2.6、count_if 3、常用排序算法 3.1、sort 3.2、random_shuffle 3.3、merge 3.4、reverse 4、常用拷贝和替换算…

在MyBatis XML文件中处理特殊符号的方法,如“>”、“<”、“>=”、“<=”这些符号XML会报错如何处理

前言 在MyBatis的XML映射文件中,我们经常需要使用特殊符号,比如"大于"、"小于"、"大于等于"、"小于等于"等比较操作符。然而,这些符号在XML中具有特殊的含义,因此需要进行特殊处理&…

nginx缓存及rsync远程访问控制

nginx缓存功能 http{ proxy_cache_path /data/nginx/cache/levels1:2 keys_zonemy_cache:10m max_size10g inactive60m use_temp_pathoff; path强制参数,指定缓存文件的存放路径。 levels: 定义了缓存目录的层级。每层可以用1(最多16种选择,0-f)或2(最…

2023年认证杯SPSSPRO杯数学建模A题(第一阶段)碳板跑鞋全过程文档及程序

2023年认证杯SPSSPRO杯数学建模 A题 碳板跑鞋 原题再现: 在专业运动鞋上使用的碳板,也可被称为碳纤维增强环氧树脂材料,事实上是将碳纤维织成布,再浸入环氧树脂固化后形成的板材。它以较轻的重量达到了相当好的弹性和刚度。在上…

【jvm系列-13】jvm性能调优篇---参数设置以及日志分析

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

【腾讯云FinOps Crane 集训营】让我看看还有谁没用过crane这个降本利器

近几年云原生概念的发展如雨后春笋,势如破竹,而devops和k8s(Kubernetes)两兄弟也搭上云原生的车先后火了起来 devops:如字面意思Development&Operations,它的理念是开发即运维,目的是消除开发者们与运维之间的隔阂…

OpenCV:从 CMake 产生 VS2019 项目和解决方案

CMake 是一个跨平台的自动化编译程序,它用于管理代码的构建过程。使用 CMake 可以简化跨平台项目的构建和移植,提供简单而强大的语法来描述构建过程,并生成多种不同的构建系统,如 GNU Make、Ninja 和 Visual Studio。因为 CMake 具…

shell编程(编写、执行,shell变量、传参、字符串、运算符使用)

来认识一下吧 Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。 Shell 既是一种命令语言,又是一种程序设计语言。 Shell script 是一种为 shell 编写的脚本程序。Shell 编程一般指 shell 脚本编程,不是指开发 she…

Python实现ACO蚁群优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

快速部署一套K8s集群-参考阿良老师

1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 二进制包 从github下载发行…

节省维护成本,提高效率!接口自动化测试框架热加载技术解析

目录 一、简介 二、实现热加载技术的具体操作 1. 借助Java类加载器实现热加载 2. 应用热加载技术动态更新代码 三、封装热加载技术 四、总结 前言 现如今,接口自动化测试已经成为了软件开发过程中不可或缺的一部分,通过使用接口自动化框架可以在效…

cpp 类成员函数delete this 会发生什么?

如题 this 简介: 每个非静态的类成员函数默认参数都会压栈一个this,它指向的是调用改成员函数的对象, 也是就className的object this 被隐含声明为 className* const this; 1.意味着不能改变this的指向2.this是个右值,不能取地址 ,不能&this 那我…

vue实现用户动态权限登录

一、使用vueelementUI搭登录框架,主要就是1、2、3、4 配置: ①vue.config.js use strict const path require(path)function resolve(dir) {return path.join(__dirname, dir) }// All configuration item explanations can be find in https://cli.v…

想自学写个操作系统,有哪些推荐看的书籍?

前言 哈喽,我是子牙,一个很卷的硬核男人。喜欢研究底层,聚焦做那些大家想学没地方学的课程:手写操作系统、手写虚拟机、手写编程语言… 今天我们将站在一个自学者的角度来聊聊如何实现自己的操作系统。并为大家推荐几本能够帮助你…

Ubuntu20.04配置静态IP地址,开启远程连接

本文操作演示为windows系统使用虚拟机安装的ubuntu系统进行:操作系统为ubuntu20.04,VMware15.5.0 build-14665864,内容分为两部分,第一部分为配置ubuntu系统的静态ip地址,第二部分内容为修改配置开启远程连接功能 一、…

第16章_变量、流程控制与游标

第16章_变量、流程控制与游标 1. 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。 在 MySQL 数据库中,变量分为系统变量以及用户自定义变量。 1.1 系统变量 1.1.1 系统变量分…

Ansys Lumerical | 对铁电波导调制器进行仿真应用

说明 在本例中,我们仿真了使用BaTiO2的铁电波导调制器,BaTiO2是一种折射率因外加电场而发生变化的材料。该器件的结构基于文献[1]。我们模拟并分析了给定工作频率下波导调制器的有效折射率与电压的关系。 背景 铁电波导由硅层和玻璃衬底上的BiTiO3&#…

《实战大数据》书评

前言 首先感谢 CSDN 社区图书馆 举办的“图书活动第四期”,让我获得了“《实战大数据——分布式大数据分析处理系统开发与应用》”这本书。收到此书之后,对里面的内容非常感兴趣,同时也充满的未知的期待。 当今时代,物联网、大数据…

第四章 数学知识

第四章 数学知识 初等数论二&#xff1a;https://www.acwing.com/blog/content/26394/ 质数 试除法判定质数 bool is_prime(int x) {if (x < 2) return false;for (int i 2; i < x / i; i )if (x % i 0)return false;return true; }试除法分解质因数 void divide…