Vue3-管理状态 effectScope

EffectScope 是 Vue 3.2 版本引入的一个新 API,它允许开发者创建一个 effect 作用域,以捕获在该作用域内创建的响应式副作用(如计算属性和侦听器)。这些副作用可以一起被处理,使得状态管理更加灵活和可控。以下是对 EffectScope 在全局或局部状态管理中使用的详细介绍:

一、EffectScope 的基本概念

EffectScope 提供了一个作用域,用于管理其内部创建的响应式 effect(包括计算属性、侦听器等)。通过 EffectScope,可以更方便地控制这些副作用的生命周期,以及在需要时停止它们。

二、EffectScope 的使用方法

  1. 创建 EffectScope:

    使用 effectScope() 函数创建一个新的 EffectScope 实例。

    复制代码
    const scope = effectScope();
  2. 运行副作用:

    使用 scope.run() 方法在 EffectScope 中运行副作用。该方法接受一个回调函数,该回调函数内部可以定义计算属性、侦听器等。

    复制代码
    scope.run(() => {
      const doubled = computed(() => counter.value * 2);
      watch(doubled, () => console.log(doubled.value));
      watchEffect(() => console.log('Count: ', doubled.value));
    });

    3、停止 EffectScope:

    使用 scope.stop() 方法停止 EffectScope,并注销其内部的所有副作用。

    复制代码
    scope.stop();

三、EffectScope 在全局或局部状态管理中的应用

  1. 全局状态管理:

    在全局状态管理中,EffectScope 可以用于管理跨组件的响应式状态。例如,可以创建一个全局的 EffectScope 来管理某个全局状态,并在需要时停止该作用域内的所有副作用。

    复制代码
    // 假设有一个全局的状态管理库
    let globalState = reactive({
      count: 0,
    });
    
    const globalScope = effectScope();
    
    globalScope.run(() => {
      const doubledCount = computed(() => globalState.count * 2);
      watch(doubledCount, () => {
        console.log('Global doubled count changed:', doubledCount.value);
      });
    });
    
    // 在某个组件中,可以访问和修改 globalState
    // 当 globalState.count 变化时,globalScope 内的副作用会被触发

    当不再需要全局状态时,可以调用 globalScope.stop() 来停止所有相关的副作用。

  2. 局部状态管理:

    在局部状态管理中,EffectScope 可以用于管理组件内部的响应式状态。例如,在一个复杂的组件中,可能需要创建多个计算属性和侦听器来处理不同的状态变化。这时,可以使用 EffectScope 将这些副作用组织在一起,并在组件卸载时停止它们。

    复制代码
    <template>
      <div>
        <p>{
        
        { localCount }}</p>
        <button @click="incrementLocalCount">Increment</button>
      </div>
    </template>
    
    <script setup>
    import { ref, effectScope, computed, watchEffect } from 'vue';
    
    const localCount = ref(0);
    
    const localScope = effectScope();
    
    localScope.run(() => {
      const doubledLocalCount = computed(() => localCount.value * 2);
      watchEffect(() => {
        console.log('Local doubled count:', doubledLocalCount.value);
      });
    
      watch(localCount, (newVal, oldVal) => {
        console.log('Local count changed from', oldVal, 'to', newVal);
      });
    });
    
    function incrementLocalCount() {
      localCount.value++;
    }
    
    // 在组件卸载时,可以调用 localScope.stop() 来停止所有副作用
    // onUnmounted(() => {
    //   localScope.stop();
    // });
    </script>
  3. 注意:在上面的示例中,虽然提供了在组件卸载时停止 EffectScope 的注释代码,但在 Vue 3 的 setup 函数中,通常不需要手动停止 EffectScope。因为 Vue 会自动管理组件的生命周期,并在组件卸载时停止所有相关的响应式副作用。然而,在某些特殊情况下(如动态创建和销毁 EffectScope),可能需要手动调用 scope.stop()。

四、注意事项

  • EffectScope 的创建和停止应该成对出现,以确保资源的正确释放和避免内存泄漏。
  • 在使用 EffectScope 时,要注意其作用域内的副作用可能会相互影响,因此需要谨慎组织和管理这些副作用。
  • EffectScope 提供了更灵活的状态管理方式,但也需要开发者对 Vue 的响应式系统有更深入的理解。

综上所述,EffectScope 是 Vue 3 中一个强大的 API,它允许开发者在全局或局部状态管理中更灵活地控制响应式副作用。通过合理使用 EffectScope,可以提高代码的可读性和可维护性,并减少手动管理依赖的麻烦。

相关推荐
子兮曰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