Skip to content

Reactivity API(响应式与调度)

本页按「一个 API 一个小节」组织,结构参考 Vue 官方 API 文档。每个小节都包含用途、类型入口与使用建议,便于快速定位与深入阅读。

状态创建与派生

ref()

类型签名: typeof import('wevu')['ref']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:Ref<T>
  • 用途:创建最常用的基础响应式引用,适合原始值或独立状态。
  • 说明:读取使用 ref.value;在模板中会自动解包。

customRef()

类型签名: typeof import('wevu')['customRef']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:CustomRefFactory<T> / CustomRefOptions<T>
  • 用途:自定义 track/trigger 行为。
  • 说明:适合防抖输入、手动控制触发时机等高级场景。

reactive()

类型签名: typeof import('wevu')['reactive']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:object
  • 用途:创建深层响应式对象,适合聚合状态。
  • 说明:对嵌套对象也会做代理;适合表单、复杂页面状态。

shallowRef()

类型签名: typeof import('wevu')['shallowRef']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:ShallowRef<T>
  • 用途:只追踪 .value 本身是否变更,不做深层代理。
  • 说明:用于大对象/第三方实例,减少深层响应式开销。

shallowReactive()

类型签名: typeof import('wevu')['shallowReactive']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:object
  • 用途:仅顶层属性响应式,内部对象保持原值。
  • 说明:常用于“只关心顶层替换”的场景。

readonly()

类型签名: typeof import('wevu')['readonly']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:Readonly<T>
  • 用途:创建只读代理,防止误修改。
  • 说明:常用于向下游暴露状态快照。

shallowReadonly()

类型签名: typeof import('wevu')['shallowReadonly']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:Readonly<T>
  • 用途:创建浅层只读代理。
  • 说明:仅保护顶层字段;嵌套对象仍保持原始语义。

computed()

类型签名: typeof import('wevu')['computed']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:ComputedRef<T> / WritableComputedRef<T>
  • 用途:声明派生状态,自动缓存并按依赖更新。
  • 说明:支持只读与可写两种形式;优先用于“纯函数派生”。

本组示例

组合深层状态、独立 Ref 和派生值时,只把可序列化数据交给模板。

vue
<script setup lang="ts">
import { computed, reactive, readonly, ref, shallowRef } from 'wevu'

const count = ref(0)
const form = reactive({ price: 20, quantity: 1 })
const sdk = shallowRef<{ refresh: () => void }>()
const total = computed(() => form.price * form.quantity)
const publicForm = readonly(form)
</script>

监听与副作用

watch()

类型签名: typeof import('wevu')['watch']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:WatchOptions / WatchStopHandle
  • 用途:侦听 source 变化并执行回调。
  • 说明:适合精确观察某个字段、computed 或 getter。

watchEffect()

类型签名: typeof import('wevu')['watchEffect']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:WatchStopHandle
  • 用途:自动收集依赖并立即执行副作用。
  • 说明:适合快速联动逻辑与调试输出。

watchPostEffect()

类型签名: typeof import('wevu')['watchPostEffect']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:WatchStopHandle
  • 用途:以 post flush 语义注册自动依赖副作用。
  • 说明:用于希望等待当前更新批次之后再执行的副作用;业务侧仍要避免在高频页面滚动里写重逻辑。

watchSyncEffect()

类型签名: typeof import('wevu')['watchSyncEffect']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:WatchStopHandle
  • 用途:以 sync flush 语义注册自动依赖副作用。
  • 说明:适合极少数需要同步响应状态变化的组合式工具;普通业务优先使用 watchEffect()

effect()

类型签名: typeof import('wevu')['effect']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:WatchStopHandle
  • 用途:底层副作用 API,通常框架层/高级场景使用。
  • 说明:业务代码优先使用 watchEffect

effectScope()

类型签名: typeof import('wevu')['effectScope']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:EffectScope
  • 用途:把一组 effect/watch 放在同一作用域统一管理。
  • 说明:在组件外组合逻辑、插件场景很有用。

getCurrentScope()

类型签名: typeof import('wevu')['getCurrentScope']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:EffectScope | undefined
  • 用途:获取当前激活的 effect scope。
  • 说明:常与 onScopeDispose 配合使用。

onScopeDispose()

类型签名: typeof import('wevu')['onScopeDispose']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:() => void
  • 用途:在 scope 销毁时执行清理逻辑。
  • 说明:适合解绑事件、释放资源。

stop()

类型签名: typeof import('wevu')['stop']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:void
  • 用途:停止指定 effect/watch。
  • 说明:用于手动中断监听链路。

本组示例

把相关监听放进同一 scope,可以在页面卸载或业务结束时统一停止。

ts
import { effectScope, onScopeDispose, ref, watch, watchEffect } from 'wevu'

const count = ref(0)
const scope = effectScope()

scope.run(() => {
  const stopWatch = watch(count, value => console.log(value))
  watchEffect(() => documentTitle(count.value))
  onScopeDispose(stopWatch)
})

scope.stop()

Ref / Proxy 工具

toRef()

类型签名: typeof import('wevu')['toRef']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:Ref<T>
  • 用途:把对象某个属性映射为 ref。
  • 说明:常用于解构后保持响应式引用。

toRefs()

类型签名: typeof import('wevu')['toRefs']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:ToRefs<T>
  • 用途:批量把对象属性转换为 ref。
  • 说明:适合从 reactive 安全解构。

unref()

类型签名: typeof import('wevu')['unref']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:T
  • 用途:统一读取 ref.value 或普通值。
  • 说明:减少“值/Ref 双形态”判断分支。

toValue()

类型签名: typeof import('wevu')['toValue']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:MaybeRefOrGetter<T>
  • 用途:统一展开普通值、Ref 或 getter。
  • 说明:编写可复用工具函数时很常见。

triggerRef()

类型签名: typeof import('wevu')['triggerRef']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:void
  • 用途:手动触发 shallowRef 依赖更新。
  • 说明:用于“对象内部变更但引用未变”场景。

toRaw()

类型签名: typeof import('wevu')['toRaw']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:T
  • 用途:拿到代理前的原始对象。
  • 说明:调试或与第三方库交互时使用。

markRaw()

类型签名: typeof import('wevu')['markRaw']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:T
  • 用途:标记对象跳过响应式代理。
  • 说明:适用于大型类实例、SDK 对象。

本组示例

工具函数让组合式函数同时接受普通值、Ref 或 getter。

ts
import { reactive, shallowRef, toRaw, toRef, toRefs, toValue, triggerRef } from 'wevu'

const state = reactive({ count: 0, name: 'Ada' })
const count = toRef(state, 'count')
const fields = toRefs(state)
const config = shallowRef({ enabled: true })

config.value.enabled = false
triggerRef(config)
console.log(toValue(count), fields.name.value, toRaw(state))

响应式判定

isRef()

类型签名: typeof import('wevu')['isRef']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:type predicate
  • 用途:判断某值是否为 Ref。

isReactive()

类型签名: typeof import('wevu')['isReactive']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:type predicate
  • 用途:判断对象是否是 reactive 代理。

isShallowRef()

类型签名: typeof import('wevu')['isShallowRef']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:type predicate
  • 用途:判断是否为 shallowRef

isShallowReactive()

类型签名: typeof import('wevu')['isShallowReactive']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:type predicate
  • 用途:判断是否为 shallowReactive

isRaw()

类型签名: typeof import('wevu')['isRaw']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:boolean
  • 用途:判断对象是否被 markRaw 标记。

isReadonly()

类型签名: typeof import('wevu')['isReadonly']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:boolean
  • 用途:判断值是否来自 readonly()shallowReadonly()

isProxy()

类型签名: typeof import('wevu')['isProxy']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:boolean
  • 用途:判断值是否为 Wevu 响应式/只读代理。

本组示例

判定函数适合库边界和调试,不应代替清晰的数据建模。

ts
import { isProxy, isRaw, isReactive, isReadonly, isRef, markRaw, reactive, readonly, ref } from 'wevu'

const count = ref(0)
const state = reactive({ count: 0 })
const locked = readonly(state)
const sdk = markRaw({ version: 1 })

console.log(isRef(count), isReactive(state), isReadonly(locked))
console.log(isProxy(state), isRaw(sdk))

批处理与调度

nextTick()

类型签名: typeof import('wevu')['nextTick']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:Promise<void>
  • 用途:等待当前批次响应式更新完成。
  • 说明:常用于更新后读取最新渲染状态。

batch()

类型签名: typeof import('wevu')['batch']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:() => void
  • 用途:在同一批处理中执行一组状态改动。
  • 说明:减少中间态触发的无效计算与更新。

startBatch()

类型签名: typeof import('wevu')['startBatch']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:void
  • 用途:手动开启批处理。
  • 说明:需要与 endBatch 成对调用。

endBatch()

类型签名: typeof import('wevu')['endBatch']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:void
  • 用途:手动结束批处理并触发提交。

traverse()

类型签名: typeof import('wevu')['traverse']

运行时说明: 依赖变化进入 Wevu 调度队列,并最终收敛为小程序 setData 更新;模板状态必须保持可序列化。

示例:本组示例

  • 类型入口:unknown
  • 用途:显式遍历响应式值及其嵌套成员,建立深层依赖。
  • 说明:主要用于组合式工具和调试能力;普通业务的深层监听优先使用 watch()deep 选项。

本组示例

业务代码优先使用 batch();手动批处理必须用 finally 保证配对结束。

ts
import { batch, endBatch, nextTick, ref, startBatch } from 'wevu'

const count = ref(0)
batch(() => {
  count.value += 1
  count.value += 1
})
await nextTick()

startBatch()
try {
  count.value += 1
}
finally {
  endBatch()
}

内部能力说明

响应式内部调度与调试函数(如 reactive 树预链接、深度策略切换)属于框架内部能力,文档页不再展开展示。若你在业务侧需要类似能力,建议优先使用本页已列出的公开 API 组合实现。

Released under the MIT License.