vue3 中响应式API有哪些?
- 核心响应式 API:创建响应式数据的基础。
-
计算属性与侦听器:派生状态和副作用处理。
-
Ref 相关工具:用于操作和转换
ref。 -
浅层响应式 API:用于性能优化,只处理浅层响应性。
-
原始值操作 API:与响应式系统交互的低级工具。
-
响应式工具函数:用于检查和判断响应式状态。
1. 核心响应式 API
这是创建响应式数据最基础的 API。
reactive()
-
作用:创建一个深度响应式的对象或数组的代理。
-
特点:
-
深度转换:对象的所有嵌套属性都会被递归地转为响应式。
-
仅用于对象类型:不能用于原始值(
string,number,boolean等)。 -
解构丢失响应性:直接对
reactive对象进行 ES6 解构,其属性会失去响应性。需要使用toRefs来解决。
-
-
示例:
readonly()
-
作用:接受一个对象(响应式或普通)或 ref,并返回一个原始对象的只读代理。
-
特点:
-
深度只读:任何尝试设置操作的都会失败并在开发模式下产生警告,包括嵌套属性。
-
与源属性“链接”:如果源对象是响应式的,只读代理会同步变化,只是你不能直接修改它。
-
-
示例:
ref()
-
作用:接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象只有一个
.valueproperty,指向该内部值。 -
特点:
-
可用于任何类型:不像
reactive,ref可以包装任何值,包括原始值和对象。 -
.value访问:在 JS 中读取或修改都需要通过.value,在模板中会自动“解包”,无需.value。 -
对象处理:如果
.value是一个对象,会用reactive()深度转换其值。
-
-
示例:
2. 计算属性与侦听器
computed()
-
作用:创建一个依赖于其他响应式状态的计算属性。
-
特点:
-
缓存:计算结果会被缓存,只有依赖的响应式值发生变化时才会重新计算,性能高效。
-
两种形式:接受一个 getter 函数(只读)或一个带有
get和set函数的对象(可写)。
-
-
示例:
watch()
-
作用:显式地侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数。
-
特点:
-
惰性:不会立即执行,只有在源发生变化时执行。
-
精确控制:可以获取变化前的旧值和变化后的新值。
-
多种数据源:可以侦听
ref、reactive对象的属性、getter 函数或以上组成的数组。
-
-
示例:
watchEffect()
-
作用:立即执行传入的函数,同时自动追踪其依赖,并在其依赖变更时重新运行该函数。
-
特点:
-
自动依赖收集:无需手动指定侦听源,函数体内用到的响应式属性都会被自动收集为依赖。
-
立即执行:会立即运行一次以收集依赖。
-
更简洁:适用于依赖众多且逻辑紧密的场景。
-
-
示例:
3. Ref 相关工具函数
toRef()
-
作用:为源响应式对象上的某个属性创建一个 ref。这个 ref 会与其源属性保持同步。
-
适用场景:当你想要将
props的某个属性传递给一个组合式函数时,确保即使该属性不存在,ref 也会保持响应式。 -
示例:
toRefs()
-
作用:将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向源对象相应属性的 ref。
-
适用场景:在从组合式函数返回
reactive对象时,或在解构props时,保持响应性。 -
示例:
isRef()
-
作用:检查一个值是否为一个 ref 对象。
-
示例:
unref()
-
作用:这是一个语法糖:
val = isRef(val) ? val.value : val。 -
适用场景:在可能接收到 ref 或普通值的函数中非常有用。
-
示例:
4. 浅层响应式 API (性能优化)
这些 API 只创建浅层响应式对象,忽略嵌套属性的响应式转换,在某些场景下可以提升性能。
shallowRef()
-
作用:创建一个 ref,只跟踪其
.value本身的变化,不关心.value内部的属性。 -
与
ref区别:ref会深度转换对象,shallowRef不会。 -
适用场景:存储大型数据结构(如复杂的嵌套对象)或不需要深度监听变化的外部第三方类实例。
-
示例:
shallowReactive()
-
作用:创建一个响应式代理,只跟踪其自身属性的响应性(第一层属性),忽略所有深层属性的响应性。
-
与
reactive区别:reactive是深度的,shallowReactive是浅层的。 -
示例:
shallowReadonly()
-
作用:类似于
readonly(),但只将根级别属性设置为只读,深层属性仍然可以被修改(尽管不是响应式的)。 -
示例:
5. 原始值操作 API (高级)
toRaw()
-
作用:返回由
reactive()、readonly()、shallowReactive()或shallowReadonly()创建的代理对应的原始对象。 -
适用场景:用于临时读取数据而不会引起代理访问/跟踪开销,或是用于修改数据而不触发变更(谨慎使用!)。
-
示例:
markRaw()
-
作用:标记一个对象,使其永远不会被转换为代理。返回对象本身。
-
适用场景:当你有一个复杂的第三方类实例,或者一个不可变的数据结构,并且确信它们不需要响应性时,用于性能优化。
-
示例:
6. 响应式工具函数
isReactive()
-
作用:检查一个对象是否是由
reactive()或shallowReactive()创建的代理。
isReadonly()
-
作用:检查一个对象是否是由
readonly()或shallowReadonly()创建的代理。
isProxy()
-
作用:检查一个对象是否是由
reactive(),readonly(),shallowReactive()或shallowReadonly()创建的代理。
总结与选择指南
| 你的需求 | 推荐使用的 API |
|---|---|
| 创建一个基本类型的响应式变量 | ref |
| 创建一个复杂对象/数组的响应式变量 | reactive |
| 基于其他状态创建一个派生值 | computed |
| 侦听响应式状态的变化并执行副作用 | watch / watchEffect |
解构 reactive 对象或 props 并保持响应性 |
toRefs |
将 props 的某个属性安全传递给组合式函数 |
toRef |
| 需要一个大型对象的响应式,但性能是关键 | shallowRef / shallowReactive |
| 需要创建一个不允许修改的响应式对象 | readonly / shallowReadonly |
| 需要跳过代理,直接操作或读取原始对象 | toRaw |
| 确保一个对象永远不会被转为响应式代理 | markRaw |
本文来自博客园,作者:Carvers,转载请注明原文链接:https://www.cnblogs.com/carver/articles/19088482

浙公网安备 33010602011771号