当前位置: 首页 > news >正文

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 官方文档。

相关文章:

  • Linux:git和gdb/cgdb
  • 多线程(线程安全)
  • MacOS上如何运行内网穿透详细教程
  • Puter部署指南:基于Docker的多功能个人云平台掌控自己的数据
  • 《Pinia 从入门到精通》Vue 3 官方状态管理 -- 进阶使用篇
  • 音视频之H.265/HEVC量化
  • Streamlit从入门到精通:构建数据应用的利器
  • CGAL 网格等高线计算
  • 参考文献新国标GB/T 7714-2025的 biblatex 实现
  • CF每日4题
  • 云智融合普惠大模型AI,政务服务重构数智化路径
  • openwrt作旁路由时的几个常见问题 openwrt作为旁路由配置zerotier 图文讲解
  • 【数据分析实战】使用 Matplotlib 绘制玫瑰图
  • 【hadoop】HBase分布式数据库安装部署
  • P1217 [USACO1.5] 回文质数 Prime Palindromes【python】
  • Crawl4AI 部署安装及 n8n 调用,实现自动化工作流(保证好使)
  • Kotlin基础知识全面解析(下)
  • 深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret
  • Kotlin Multiplatform--02:项目结构进阶
  • 【产品经理从0到1】Axure介绍
  • 俄总理:2024年俄罗斯GDP增长4.3%
  • 十三届全国政协经济委员会副主任张效廉严重违纪违法被开除党籍
  • 金发科技去年净利增160%,机器人等新领域催生材料新需求
  • 民建吉林省委提案:当前生育政策集中鼓励多孩生育,应该转变思路
  • 中印尼“2+2”:中国周边外交的范式突破与东南亚棋局重构
  • 平均25岁,天津茱莉亚管弦乐团进京上演青春版《春之祭》