# 特殊的 Api
# effectScope & onScopeDispose
TIP
在Vue的setup中,响应会在开始初始化的时候被收集,在实例被卸载的时候,响应就会自动的被取消追踪了,这时一个很方便的特性。但是,当我们在组件外使用或者编写一个独立的包时,这会变得非常麻烦。当在单独的文件中,我们该如何停止computed & watch的响应式依赖呢?
- 概述:
effectScope可以创建收集产生副作用函数Effect的作用域computedwatchwatchEffect
import { effectScope, ref, computed, watch, watchEffect } from 'vue'
const scope = effectScope()
scope.run(() => {
const count = ref(1)
const db = computed(() => count.value * 2)
watch(count, () => console.log(count.value))
watchEffect(() => {
console.log(count.value)
})
})
// 统一收集清除
scope.stop()
- 概述:
onScopeDispose,当scope.stop()停止一个作用域时触发。
TIP
每一个Vue-Setup都会创建一个属于自己的scope,当没有使用effectScope创建scope时,onScopeDispose相当于onUnMounted
// ...
scope.run(() => {
// 当 scope.stop() 时触发
onScopeDispose(() => {
console.log('clear')
})
})
scope.stop()