在项目开发中,其实一直在使用 effect 作用域,只是你未曾意识到。
Effect 作用域(Effect Scope)是 Vue 3.2 引入的底层管理机制,用于组织响应式副作用的生命周期。它通过作用域隔离和批量控制解决了内存泄漏与副作用清理的难题,是构建高性能 Vue 应用的基础设施。
副作用(Effect) 指函数内影响外部状态的操作(如修改全局变量、发起异步请求)。Vue 的响应式系统依赖副作用实现自动化更新:
const count = ref(0);
watchEffect(() => console.log(count.value)); // 副作用:监听 count 变化
watch
/computed
/watchEffect
)绑定为逻辑单元,支持统一启停。关键价值:
批量管理:替代手动调用多个 stop()
的繁琐逻辑;内存安全:确保无用的副作用被及时回收; 嵌套控制:支持作用域层级继承,符合组件化设计思想。
import { effectScope, ref, watchEffect } from "vue";
const scope = effectScope(); // 创建作用域
scope.run(() => {
const state = ref(0);
watchEffect(() => console.log(state.value)); // 副作用注册到当前作用域
});
scope.stop(); // 停止所有内部副作用
run()
捕获函数内所有新创建的副作用;stop()
递归停止作用域内全部响应式依赖。parentScope.run(() => {
const childScope = effectScope();
childScope.run(/* 子级副作用 */);
});
parentScope.stop(); // 停止 parentScope 及所有子作用域
const detachedScope = effectScope(true); // 参数 true 表示独立
detachedScope.stop(); // 需手动调用
在作用域销毁时执行自定义清理逻辑(如清除定时器):
scope.run(() => {
const timer = setInterval(/*...*/, 1000);
onScopeDispose(() => clearInterval(timer)); // 作用域停止时触发
});
function useTimer(interval = 1000) {
const scope = effectScope();
const count = ref(0);
let timerId;
scope.run(() => {
watchEffect(() => {
timerId = setInterval(() => count.value++, interval);
});
onScopeDispose(() => clearInterval(timerId));
});
return { count, stop: () => scope.stop() }; // 暴露清理接口
}
优势:
在复杂组件中,按功能模块划分作用域:
<script setup>
const moduleA = effectScope();
moduleA.run(() => {
// 模块A的副作用(如数据监听)
});
onUnmounted(() => moduleA.stop()); // 随组件卸载清理
</script>
实践建议:
独立作用域适合管理跨组件共享状态:
const globalScope = effectScope(true);
globalScope.run(() => {
const store = reactive({ /* 全局状态 */ });
watch(store, /* 全局监听 */);
});
// 应用销毁时手动调用 globalScope.stop()
setup()
函数在独立的 Effect 作用域中运行,卸载时自动触发 scope.stop()
;设计原理:
Vue 通过 "当前活跃作用域栈" 追踪副作用归属。调用run()
时,临时将当前作用域设为活跃状态,使内部副作用自动挂载其下。
Effect 作用域是 Vue 响应式系统的底层基石,其价值体现在三个维度:
尽管多数场景由 Vue 自动管理,理解 Effect 作用域机制仍有助于开发高性能、可维护的 Vue 应用,尤其在复杂状态逻辑封装中具有不可替代性。
参考文献:
最后
还没有使用过我们刷题网站(https://fe.ecool.fun/)或者刷题小程序的同学,如果近期准备或者正在找工作,千万不要错过,题库已经更新1600多道面试题,除了八股文,还有现在面试官青睐的场景题,甚至最热的AI与前端相关的面试题已经更新,努力做全网最全最新的前端刷题网站。
有会员购买、辅导咨询的小伙伴,可以通过下面的二维码,联系我们的小助手。