Vue3 Composition API响应式原理
响应式基本概念
响应式是指当数据发生变化时,相关联的元素(如视图)会自动更新。类似于Excel的公式计算,当单元格数据更新,依赖该数据的公式结果也会自动更新。在Vue中,响应式系统确保当响应式数据变化时,使用该数据的组件视图会自动刷新。
Vue3响应式技术实现
Vue3的响应式系统基于两个关键的JavaScript API:
- Proxy: Vue3使用Proxy替代了Vue2中的Object.defineProperty来创建响应式对象
- Reflect: 配合Proxy使用,实现对对象操作的拦截和定制
这种实现方式解决了Vue2响应式系统的诸多限制,如无法检测对象属性的添加和删除、无法直接监听数组索引变化等问题。
Composition API中的响应式API
Vue3 Composition API提供了几个核心响应式API:
1. reactive()
import { reactive } from 'vue'
// 创建响应式对象
const state = reactive({
name: '张三',
age: 25,
job: {
type: '程序员',
salary: 10000
}
})
reactive()用于创建一个响应式对象,它会将传入的普通对象转换为Proxy对象,深度跟踪对象内所有属性的变化。
2. ref()
import { ref } from 'vue'
// 创建响应式变量
const count = ref(0)
// 修改值需要使用.value
function increment() {
count.value++
}
ref()用于创建一个包含响应式值的引用对象。它可以包装JavaScript基本类型,如数字、字符串等,内部实际上也是借助了reactive()实现。
响应式原理工作流程
- 创建响应式对象:通过
reactive或ref创建响应式数据 - 依赖收集:当组件渲染或计算属性读取响应式数据时,会建立数据与更新函数之间的依赖关系
- 触发更新:当响应式数据发生变化时,会通知所有依赖这些数据的更新函数执行
需要注意的是,DOM更新并不是同步的。
关于Vue DOM更新的简单解释
当我说"DOM更新并不是同步的",这意味着什么呢?让我用更简单的方式解释:
简单来说
当你在Vue中改变数据时,网页上的内容并不会立即更新。Vue会先收集你所有的修改,然后一次性更新页面,这样做更高效。
生活中的类比
想象你在写一份购物清单:
- 如果每写一项就跑去商店买一次,这就像"同步更新",非常低效
- 而先把整个清单写完,再一次性去购物,这就像Vue的"异步更新",更加高效
实际工作方式
- 你修改了Vue中的数据(比如
count.value = 5) - Vue记下了这个修改,但暂时不更新页面
- 即使你连续修改多次数据,Vue也只会记录最终结果
- 等你的代码执行完毕后,Vue才会把所有变化一次性应用到页面上
好处
- 性能更好:减少不必要的页面重绘
- 避免重复工作:如果同一个数据在一个操作中被修改多次,Vue只会用最终值更新一次页面
- 更一致的视图:确保用户看到的始终是数据变化后的完整结果
简单示例
// 假设页面上显示 count = 0
const count = ref(0)
// 执行以下代码
count.value = 1
count.value = 2
count.value = 3
// Vue不会更新三次页面,而是等这些代码执行完,
// 然后一次性将页面上的0更新为3
这就像Vue在说:"别着急,让我先收集所有变化,然后一次性高效地更新页面,这样对大家都好!"
与Vue2响应式系统的对比
Vue3的响应式系统相比Vue2有显著优势:
- 性能提升:初次渲染快55%,更新渲染快133%
- 内存减少54%
- 打包大小减少41%
- 可以检测到对象属性的添加和删除
- 可以直接监听数组的变化
- 更好的TypeScript支持
使用示例
<script setup>
import { ref, reactive, onMounted } from 'vue'
// 响应式状态
const count = ref(0)
const user = reactive({
name: '张三',
age: 25
})
// 更改状态的函数
function increment() {
count.value++
user.age++
}
onMounted(() => {
console.log('组件已挂载')
})
</script>
<template>
<div>
<p>计数: {{ count }}</p>
<p>用户: {{ user.name }},年龄: {{ user.age }}</p>
<button @click="increment">增加</button>
</div>
</template>
Vue3的Composition API和响应式系统紧密结合,为开发者提供了更灵活、更强大的组件逻辑组织方式,使代码更易于理解和维护。
喜欢的话,请点赞,转发、收藏、评论,谢谢!

浙公网安备 33010602011771号