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

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

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

官网介绍:

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

作用

scope.run内可创建多个 像watch、watchEffect这种响应式函数,然后通过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 {}
  }
}
相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A3 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
honkun63 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net