const count = ref(0) // 创建响应式变量
count.value++
count++
- 用于基本类型(也可用于对象)
- 需要通过.value访问值
- 模板中自动解包(不需.value)
- 适合简单响应式数据
const state = reactive({
count: 0,
name: 'John'
})
count.value++
count++
- 用于对象/数组等复杂类型
- 不需要.value直接访问
- 不能解构(会失去响应性)
- 适合复杂状态对象
const doubleCount = computed(() => count.value * 2)
- 基于依赖自动计算
- 具有缓存(依赖不变不重新计算)
- 返回一个不可变的ref
- 适合派生状态
watch(() => state.count, (newVal, oldVal) => { // 回调
console.log(`count变化: ${oldVal} -> ${newVal}`)
})
- 精确监听特定数据源
- 可以获取旧值和新值
- 需要手动指定监听源
- 适合需要旧值的场景
watchEffect(() => {
console.log('count值:', count.value)
})
- 自动追踪依赖
- 立即执行一次
- 无法获取旧值
- 适合不需要旧值的场景
特性 | ref() | reactive() | computed() | watch() | watchEffect() |
---|
用途 | 基本类型响应式 | 对象响应式 | 计算属性 | 监听变化 | 自动依赖监听 |
访问方式 | .value | 直接访问 | .value | N/A | N/A |
缓存 | 无 | 无 | 有 | 无 | 无 |
立即执行 | 无 | 无 | 无 | 可配置 | 总是立即执行 |
主要优势 | 简单值响应 | 复杂对象响应 | 派生状态 | 精确控制监听 | 自动依赖收集 |
ref()
: 基本类型数据、需要保持响应式的单个值reactive()
: 复杂对象状态管理computed()
: 依赖其他状态的计算属性watch()
: 需要精确控制监听逻辑和获取旧值watchEffect()
: 自动追踪依赖的副作用
- 组合式API中优先使用
ref()
和reactive()
创建响应式状态 - 派生状态使用
computed()
- 需要执行副作用时:
- 需要旧值 ->
watch()
- 不需要旧值 ->
watchEffect()
- 避免在
reactive()
中使用解构 - 复杂逻辑可组合多个响应式API使用