vue3中的effectScope有什么作用,如何使用?如何自动清理

vue3中的effectScope有什么作用,如何使用?如何自动清理

vue3中的effectScope有什么作用,如何使用

官网介绍:

创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理。

作用

scope.run内可创建多个 像watchwatchEffect这种响应式函数,然后通过scope.stop()停止里面的所有响应式函数。

批量管理副作用: 可以把多个 effect 函数放到一个 effectScope 里,然后通过 effectScope.stop() 方法一次性停止所有这些副作用函数的运行。
组件卸载时清理副作用: 在组件卸载时,使用 effectScope 能够更方便地清理所有相关的副作用,避免内存泄漏。
支持嵌套作用域

特点

  • Vue 3.2+ 新增的 API
  • 主要用于组织和批量管理 effect
  • 特别适合在组件 setup 中使用
  • 支持自动清理

简单示例:

html 复制代码
<script setup lang="ts">
  import { effectScope, reactive, watch, watchEffect } from 'vue';

  const scope = effectScope();

  const state = reactive({ count: 0 });
  scope.run(() => {
    // 这些 effect 都会被 scope 管理
    watch(
      () => state.count,
      (count) => {
        console.log('effectScope管理的watch监听:', count);
      }
    );
    watchEffect(() => {
      console.log('effectScope管理的watchEffect监听', state.count);
    });
  });

  // 停止所有 effect,会将上面的watch和watchEffect都停止。
  const handleStop = () => {
    scope.stop();
  };

// 自己调用watch监听
  const singleWatch = watch(
    () => state.count,
    (count) => {
      console.log('单个监听watch:', count);
    }
  );
  // 停止自己创建的watch监听
  const handleStopWatch = () => {
    singleWatch();
  };
</script>

<template>
  <a-button @click="state.count++">count:{{ state.count }}</a-button>
  <a-button @click="handleStop">停止</a-button>
  <a-button @click="handleStopWatch">停止 watch</a-button>
</template>

<style scoped lang="less"></style>

自动清理示例

使用onScopeDispose实现组件卸载时自动,自动清理effectScope

js 复制代码
import { effectScope, onScopeDispose } from 'vue'

export default {
  setup() {
    const scope = effectScope()
    
    scope.run(() => {
      // 所有响应式逻辑
      const state = reactive({ /*...*/ })
      watch(/*...*/)
      computed(/*...*/)
    })
    
    onScopeDispose(() => {
      scope.stop() // 组件卸载时自动清理
    })
    
    return {}
  }
}
相关推荐
lichenyang4531 小时前
React ajax中的跨域以及代理服务器
前端·react.js·ajax
呆呆的小草1 小时前
Cesium距离测量、角度测量、面积测量
开发语言·前端·javascript
WHOAMI_老猫1 小时前
xss注入遇到转义,html编码绕过了解一哈
javascript·web安全·渗透测试·xss·漏洞原理
一 乐2 小时前
民宿|基于java的民宿推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·源码
testleaf2 小时前
前端面经整理【1】
前端·面试
BillKu2 小时前
Vue3 + TypeScript + Element Plus 表格行按钮不触发 row-click 事件、不触发勾选行,只执行按钮的 click 事件
vue.js·elementui·typescript
好了来看下一题2 小时前
使用 React+Vite+Electron 搭建桌面应用
前端·react.js·electron
啃火龙果的兔子2 小时前
前端八股文-react篇
前端·react.js·前端框架
小前端大牛马3 小时前
react中hook和高阶组件的选型
前端·javascript·vue.js
刺客-Andy3 小时前
React第六十二节 Router中 createStaticRouter 的使用详解
前端·javascript·react.js