effectscope 是 vue 3.2+ 提供的响应式副作用容器,支持集中创建、手动销毁,可嵌套、脱离式使用,并通过 scope.stop() 统一清理 watch/computed/effect 等,适用于轮询、模块化资源管理等场景。

effectScope 是 Vue 3.2+ 引入的响应式副作用管理工具,核心价值在于“集中创建、统一销毁”——它不替代 watch 或 computed,而是为它们提供一个可手动控制的容器。
作用域创建与副作用收集
调用 effectScope() 创建一个作用域实例,它本身不执行任何逻辑;所有副作用必须通过 scope.run(() => { ... }) 注入。在 run 回调中定义的 computed、watch、watchEffect、effect 等,会自动被该作用域捕获。
- 未进入 run 的副作用不会被收集,也不受 scope 控制
- 同一个作用域内可多次调用 run(如条件分支中),所有注册的副作用都会归入该 scope
- 支持嵌套:子 scope 默认依附于父 scope,父 scope.stop() 时子 scope 自动停止
主动清理与生命周期解耦
调用 scope.stop() 会立即停止并清理该作用域内所有已注册的响应式操作,包括:
- 所有 watch 和 watchEffect 的监听器
- 所有 computed 的依赖追踪与缓存
- 所有手动创建的 effect 实例
这使你摆脱了 onUnmounted 的绑定限制,可在任意时机(如用户退出页面、功能模块关闭、轮询条件变更)主动释放资源,特别适合封装在 Composable 函数中供多处复用。
独立作用域与高级控制
传入 true 参数可创建 detached(脱离式)作用域:effectScope(true)。这类作用域不受外部作用域影响,即使父 scope 停止,它仍保持活跃。
- 适用于需长期存活的全局状态管理(如跨路由共享的 polling service)
- 配合 onScopeDispose 可注册清理回调,在 scope.stop 时执行自定义逻辑(如关闭 WebSocket、清除 localStorage)
- 通过 getCurrentScope() 获取当前活跃作用域,便于在深层函数中注入副作用
典型使用场景示例
以下是一个带定时轮询的请求 Hook,体现 effectScope 如何简化清理逻辑:
import { effectScope, ref, watch, onUnmounted } from 'vue'
export function usePolling(url, interval = 5000) {
const scope = effectScope()
const data = ref(null)
scope.run(() => {
const timer = setInterval(async () => {
const res = await fetch(url)
data.value = await res.json()
}, interval)
// 自动随 scope.stop() 清理
watch(data, (v) => console.log('fetched:', v))
})
// 暴露停止方法,使用者可按需调用
return { data, stop: () => scope.stop() }
}
使用者不再需要记住清理定时器、watch 或其他副作用,只需调用返回的 stop 即可一键释放全部资源。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










