响应式系统
什么是响应式系统?
Vue3 的响应式系统是其核心特性之一,它允许当数据发生变化时,视图自动更新。这意味着开发者可以专注于数据逻辑,而不必手动操作 DOM。
Vue3 响应式系统的实现原理
Vue3 使用 Proxy API 实现响应式系统,相比 Vue2 的 Object.defineProperty,具有以下优势:
- 能够监听对象的所有属性,包括新增和删除的属性
- 能够监听数组的所有操作,包括索引访问和长度变化
- 支持 Map、Set、WeakMap、WeakSet 等集合类型
- 性能更好,尤其是在大型对象上
核心 API
ref() - 用于基本类型和引用类型
import { ref } from 'vue'
const count = ref(0)
console.log(count.value) // 0
count.value++
console.log(count.value) // 1
reactive() - 用于对象类型
import { reactive } from 'vue'
const state = reactive({
count: 0,
name: 'Vue3'
})
console.log(state.count) // 0
state.count++
console.log(state.count) // 1
computed() - 计算属性
import { ref, computed } from 'vue'
const count = ref(0)
const doubleCount = computed(() => count.value * 2)
console.log(doubleCount.value) // 0
count.value++
console.log(doubleCount.value) // 2
watch() - 监听器
import { ref, watch } from 'vue'
const count = ref(0)
watch(count, (newValue, oldValue) => {
console.log(`count 从 ${oldValue} 变为 ${newValue}`)
})
count.value++ // 输出: count 从 0 变为 1
响应式系统的工作流程
- 当创建响应式对象时,Vue3 会使用 Proxy 包装原始对象
- 当访问响应式对象的属性时,会触发 getter,收集依赖
- 当修改响应式对象的属性时,会触发 setter,通知所有依赖更新
- 依赖更新会导致相关的组件重新渲染
注意事项
- ref() 创建的响应式对象需要通过 .value 访问和修改
- reactive() 只能用于对象类型,不能用于基本类型
- 解构 reactive() 创建的对象会失去响应性,需要使用 toRefs() 或 toRef() 处理
- 响应式系统只能监听同步变化,异步变化需要特殊处理