Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开

以下是 Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开:
在这里插入图片描述


1. Vue 2 的响应式 API

核心机制
  • 基于 Object.defineProperty
    • 通过劫持对象的 gettersetter 实现数据变化追踪。
    • 限制:无法检测属性的添加/删除,且不支持数组的某些变异操作(如直接修改索引 arr[0] = ...)。
主要 API
功能实现方式示例
声明响应式数据data 对象或 Vue.set/this.$set 添加属性```javascript

data() { return { count: 0 }; }
```
              |

| 计算属性 | computed 对象 | javascript <br>computed: { fullName() { return this.firstName + this.lastName; } }<br>
|
| 侦听器 | watch 对象或 this.$watch 方法 | javascript <br>watch: {<br> count: (newVal) => console.log(newVal)<br>}<br>
|
| 方法 | methods 对象 | javascript <br>methods: { increment() { this.count++; } }<br>
|

生命周期钩子
  • 分散在 Options 中:如 created, mounted, beforeDestroy 等。

2. Vue 3 的组合式 API

核心机制
  • 基于 Proxy
    • 全局响应式追踪,支持检测属性的增删改,且无需 Vue.set
    • 优势:更高效、更灵活,支持 for...in 遍历和数组变异操作。
核心函数
函数用途示例
reactive将对象转为响应式(返回 Proxy)```javascript

const state = reactive({ count: 0 });
```
          |

| ref | 将基本类型转为响应式(返回一个 .value 对象) | javascript <br>const count = ref(0);<br>
|
| computed | 声明计算属性(返回响应式引用) | javascript <br>const fullName = computed(() => state.firstName + state.lastName);<br>
|
| watch | 监听数据变化(支持更灵活的选项) | javascript <br>watch(count, (newVal) => console.log(newVal));<br>
|
| onMounted | 生命周期钩子(组合式 API 形式) | javascript <br>onMounted(() => console.log('Mounted'));<br>
|

核心函数对比
功能Vue 2Vue 3说明
响应式数据data 对象reactive/refVue 3 需显式声明响应式,支持更灵活的类型(对象/基本类型)。
计算属性computed 对象computed() 函数Vue 3 需通过函数声明,返回值需手动返回到模板。
侦听器watch 对象watch() 函数Vue 3 支持更灵活的选项(如 deep, immediate)。
方法methods 对象setup() 返回函数Vue 3 在 setup() 中定义方法并返回,无需 this

3. 组合式 API 核心特性

(1) setup() 函数
  • 入口点:所有逻辑集中在此函数中,替代 Options API 的分散选项。
  • 执行时机:在 beforeCreatecreated 之前执行。
  • 返回值:需返回一个对象,暴露给模板或子组件。
(2) ref vs reactive
函数适用场景示例
ref基本类型(如数字、字符串)或需要直接访问值的场景```javascript

const count = ref(0);
console.log(count.value);
```
reactive复杂对象(如对象、数组)或需要直接操作属性的场景```javascript

const state = reactive({ count: 0 });
console.log(state.count);
```
(3) 生命周期钩子
  • 组合式形式:通过 onXXX 前缀的函数声明(如 onMounted, onBeforeUnmount)。
  • 无需 this:直接在 setup() 中调用,无需通过 this 访问。

4. 代码示例对比

(1) 声明响应式数据
// Vue 2(Options API)
export default {data() {return { count: 0 };}
};// Vue 3(组合式 API)
import { ref } from 'vue';export default {setup() {const count = ref(0);return { count };}
};
(2) 计算属性
// Vue 2
export default {computed: {fullName() {return this.firstName + ' ' + this.lastName;}}
};// Vue 3
import { computed } from 'vue';export default {setup() {const state = reactive({firstName: 'John',lastName: 'Doe'});const fullName = computed(() => state.firstName + ' ' + state.lastName);return { fullName };}
};
(3) 生命周期
// Vue 2
export default {mounted() {console.log('Mounted');}
};// Vue 3
import { onMounted } from 'vue';export default {setup() {onMounted(() => console.log('Mounted'));return {};}
};

5. 对比总结表格

特性Vue 2Vue 3(组合式 API)优势/差异
响应式核心Object.definePropertyProxyVue 3 支持属性增删和更灵活的数组操作。
数据声明data 对象reactive/ref 显式声明Vue 3 需显式声明响应式,避免隐式问题。
计算属性computed 对象computed() 函数Vue 3 更灵活,支持返回函数或对象。
侦听器watch 对象watch() 函数Vue 3 支持更细粒度的选项(如 deep, flush)。
方法methods 对象setup() 返回函数Vue 3 逻辑集中,减少 Options 耦合。
生命周期钩子分散在 Options 中onXXX 函数集中声明Vue 3 钩子名更规范(如 onMounted),无需 this
代码复用Mixins(易冲突)自定义组合函数(无污染)组合式 API 更易复用且避免命名冲突。
模板绑定this.countcount(通过 ref)或 state.count(通过 reactiveVue 3 需通过 ref.valuereactive 对象访问值。

6. 迁移建议

  1. 逐步迁移:在 Vue 2 项目中可通过 @vue/composition-api 渐进式引入组合式 API。
  2. 优先使用组合式 API:在新项目中推荐使用组合式 API,因其更灵活、可维护。
  3. 注意 refreactive 的区别:根据数据类型选择合适的方式声明响应式。
  4. 生命周期钩子替换:Vue 3 的 setup() 会提前执行,需调整初始化逻辑顺序。

如需更详细示例,可参考 Vue 3 官方文档。

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

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

相关文章

“八股训练营”学习总结

在参加为期 40 天的八股训练营的这段时间里&#xff0c;我收获满满&#xff0c;不仅在知识技能上得到了提升&#xff0c;更在学习习惯和自我认知方面有了很大的进步。 在知识层面&#xff0c;训练营涵盖了网络、数据库、缓存以及python测试开发等多方面的知识点。 网络方面&a…

Python对比两张CAD图并标记差异的解决方案

以下是使用Python对比两张CAD图并标记差异的解决方案&#xff0c;结合图像处理和CAD结构分析&#xff1a; 一、环境准备与库选择 图像处理库&#xff1a;使用OpenCV进行图像差异检测、颜色空间转换和轮廓分析。CAD解析库&#xff1a;若为DXF格式&#xff0c;使用ezdxf解析实体…

记录学习记录学习《手动学习深度学习》这本书的笔记(九)

马不停蹄地来到了第十二章&#xff1a;计算性能…… 感觉应该是讲并行计算方面的&#xff0c;比如GPU、CPU、CUDA那些。 第十二章&#xff1a;计算性能 12.1 编译器和解释器 这里先提出了命令式编程和符号式编程的概念。 命令式编程VS符号式编程 目前为止&#xff0c;本书…

模板引擎语法-过滤器

模板引擎语法-过滤器 文章目录 模板引擎语法-过滤器[toc]1.default过滤器2.default_if_none过滤器3.length过滤器4.addslashes过滤器5.capfirst过滤器6.cut过滤器7.date过滤器8.dictsort过滤器 1.default过滤器 default过滤器用于设置默认值。default过滤器对于变量的作用&…

make学习三:书写规则

系列文章目录 Make学习一&#xff1a;make初探 Make学习二&#xff1a;makefile组成要素 文章目录 系列文章目录前言默认目标规则语法order-only prerequisites文件名中的通配符伪目标 Phony Targets没有 Prerequisites 和 recipe内建特殊目标名一个目标多条规则或多个目标共…

网络安全技能大赛B模块赛题解析Server12环境

已知靶机存在⽹站系统&#xff0c;使⽤Nmap⼯具扫描靶机端⼝&#xff0c;并将⽹站服务的端⼝号作为Flag &#xff08;形式&#xff1a;Flag字符串&#xff09;值提交 使用nmap扫描目标靶机网站服务的端口号为8089 Falg&#xff1a;8089 访问⽹站/admin/pinglun.asp⻚⾯&#…

1、Linux操作系统下,ubuntu22.04版本切换中英文界面

切换中英文界面的方法很多&#xff0c;我也是按照一个能用的方法弄过来并且记录&#xff0c; 1.如果刚开始使用Ubuntu环境&#xff0c;桌面的语言环境为英文&#xff0c;需要安装中文简体的字体包 打开桌面终端&#xff0c;输入 sudo apt install language-pack-zh-hans lan…

SmolVLM2: The Smollest Video Model Ever(六)

继续微调 微调视频的代码如下&#xff1a; # 此Python文件用于对SmolVLM2进行视频字幕任务的微调 # 导入所需的库 import os os.environ["CUDA_VISIBLE_DEVICES"] "1" import torch from peft import LoraConfig, prepare_model_for_kbit_training, get…

Spring Boot安装指南

&#x1f516; Spring Boot安装指南 &#x1f331; Spring Boot支持两种使用方式&#xff1a; 1️⃣ 可作为常规Java开发工具使用 2️⃣ 可作为命令行工具安装 ⚠️ 安装前提&#xff1a; &#x1f4cc; 系统需安装 Java SDK 17 或更高版本 &#x1f50d; 建议先运行检查命令…

数据结构(七)---链式栈

#### 链式栈实现 ##### linkstack.h #ifndef _LINKSTACK_H #define _LINKSTACK_H // 引入相关的库文件 #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义元素类型的别名 typedef int DATA; //定义链式栈节点 typedef struct node { …

【Spring Boot】Maven中引入 springboot 相关依赖的方式

文章目录 Maven中引入 springboot 相关依赖的方式1. 不使用版本管理&#xff08;不推荐&#xff09;2、使用版本管理&#xff08;推荐&#xff09;2.1 继承 spring-boot-starter-parent2.2 使用 spring-boot-dependencies 自定义父工程2.3引入 spring-framework-bom Maven中引…

DataStreamAPI实践原理——快速上手

引入 通过编程模型&#xff0c;我们知道Flink的编程模型提供了多层级的抽象&#xff0c;越上层的API&#xff0c;其描述性和可阅读性越强&#xff0c;越下层API&#xff0c;其灵活度高、表达力越强&#xff0c;多数时候上层API能做到的事情&#xff0c;下层API也能做到&#x…

WPF 图片文本按钮 自定义按钮

效果 上面图片,下面文本 样式 <!-- 图片文本按钮样式 --> <Style x:Key="ImageTextButtonStyle" TargetType="Button"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderTh…

驱动开发硬核特训 · Day 22(上篇): 电源管理体系完整梳理:I2C、Regulator、PMIC与Power-Domain框架

&#x1f4d8; 一、电源子系统总览 在现代Linux内核中&#xff0c;电源管理不仅是系统稳定性的保障&#xff0c;也是实现高效能与低功耗运行的核心机制。 系统中涉及电源管理的关键子系统包括&#xff1a; I2C子系统&#xff1a;硬件通信基础Regulator子系统&#xff1a;电源…

设计模式全解析:23种经典设计模式及其应用

创建型模式 1. 单例模式&#xff08;Singleton Pattern&#xff09; 核心思想&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。适用场景&#xff1a;需要共享资源的场景&#xff0c;如配置管理、日志记录等。 public class Singleton {// 静态变量保存…

力扣热题100题解(c++)—矩阵

73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 int m matrix.size(); // 行数int n matrix[0].size(); // 列数bool firstRowZero false; // 标记第一行是否包含 0bool f…

本地部署DeepSeek-R1(Dify升级最新版本、新增插件功能、过滤推理思考过程)

下载最新版本Dify Dify1.0版本之前不支持插件功能&#xff0c;先升级DIfy 下载最新版本&#xff0c;目前1.0.1 Git地址&#xff1a;https://github.com/langgenius/dify/releases/tag/1.0.1 我这里下载到老版本同一个目录并解压 拷贝老数据 需先停用老版本Dify PS D:\D…

PostSwigger Web 安全学习:CSRF漏洞3

CSRF 漏洞学习网站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF Token 基本原理 CSRF Token 是服务端生成的唯一、随机且不可预测的字符串&#xff0c;用于验证客户端合法校验。 作用&#xff1a;防止攻击…

用 Nodemon 解决 npm run serve 频繁重启服务

Nodemon 是一个基于 Node.js 构建的开发工具&#xff0c;专为帮助开发者自动监控项目文件的更改而设计。每当文件发生变更时&#xff0c;Nodemon 会自动重启 Node.js 服务器&#xff0c;无需手动停止并重启。这对于提升开发速度、减少人工操作非常有帮助&#xff0c;尤其适用于…

django admin 中更新表数据 之后再将数据返回管理界面

在Django中&#xff0c;更新数据库中的数据并将其重新显示在Django Admin界面上通常涉及到几个步骤。这里我将详细说明如何在Django Admin中更新表数据&#xff0c;并确保更新后的数据能够立即在管理界面上显示。 定义模型 首先&#xff0c;确保你的模型&#xff08;Model&…