返回顶部
首页 > 资讯 > 前端开发 > 其他 >Vue3里的EffectScope怎么使用
  • 519
分享到

Vue3里的EffectScope怎么使用

Vue3 2023-05-17 05:05:39 519人浏览 安东尼
摘要

Vue 3.2 版本引入了新的 Effect scope api,使用 effectScope 创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理。getCurrentS

Vue 3.2 版本引入了新的 Effect scope api,使用 effectScope 创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理。getCurrentScope 方法可用于获取当前活跃的 effect 作用域。在当前激活的 effect 作用域中注册一个处理回调函数,使用 onScopeDispose。当相关的 effect 作用域停止时会调用这个回调函数。

const scope = effectScope()

scope.run(() => {
  const doubled = computed(() => counter.value * 2)

  watch(doubled, () => console.log(doubled.value))

  watchEffect(() => console.log('Count: ', doubled.value))
})

// 处理掉当前作用域内的所有 effect
scope.stop()

在 Vue 的 setup 中,响应会在开始初始化的时候被收集,在实例被卸载的时候,响应就会自动的被取消追踪了,这时一个很方便的特性。

但是,当我们在组件外使用或者编写一个独立的包时,这会变得非常麻烦。在单独的文件中,如何取消 computed和watch 的响应式依赖?

示例代码,参考链接

const disposables = []

const counter = ref(0)
const doubled = computed(() => counter.value * 2)

disposables.push(() => stop(doubled.effect))

const stopWatch2 = watchEffect(() => {
  console.log(`counter: ${counter.value}`)
})

disposables.push(stopWatch2)

const stopWatch3 = watch(doubled, () => {
  console.log(doubled.value)
})

disposables.push(stopWatch3)

上面的代码中,我们写了一共三个 computed & watch 的响应式依赖,把这些响应式依赖的 stopHandle 都存到一个数组中,意思是我们需要维护这个数组,这样将来在需要的时候,就可以像下面这样,直接把所有的响应都停掉:

disposables.forEach((f) => f())
disposables = []

特别是在处理一些复杂的组合式函数代码时,手动收集所有响应式依赖是很繁琐的。如果您无法访问在组合式函数中创建的响应式依赖,收集它们可能很容易被遗忘,这可能导致内存泄漏和意外行为。

该特性就是试图将组件的 setup() 响应式依赖收集和处理功能抽象为更通用的 API,该 API 可以在组件模型之外复用。

它还提供了从组件的 setup() 范围或用户定义的范围创建“分离” effects 的功能。

这个功能解决了什么问题?

// global shared Reactive state
let foo

function useFoo() {
  if (!foo) { // lazy initialization
      foo = ref()
      watch(foo, ...) // <- this is stopped when component that created it is unmounted
      // make some Http calls etc
  }
  return foo
}

component1 = {
    setup() {
        useFoo() // lazily initialize
    }
}

component2 = {
    setup() {
        useFoo() // lazily initialize
    }
}

我有一个在多个组件之间共享功能的组合式函数,问题是当卸载第一个调用的组件时 component1 停止 useFoo 响应式依赖。由于持续对全局变量 foo 的影响会影响其他组件的调用,因此需要停止这种影响。

以上就是vue3里的EffectScope怎么使用的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Vue3里的EffectScope怎么使用

本文链接: https://lsjlt.com/news/210622.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue3里的EffectScope怎么使用
    Vue 3.2 版本引入了新的 Effect scope API,使用 effectScope 创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理。getCurrentS...
    99+
    2023-05-17
    Vue3
  • 深入理解Vue3里的EffectScope
    Vue 3.2 版本引入了新的 Effect scope API,使用 effectScope 创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和侦听器...
    99+
    2022-11-13
    Vue3 EffectScope
  • 怎么使用vue3的setup()
    本篇内容主要讲解“怎么使用vue3的setup()”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用vue3的setup()”吧!从 vue2 升级到 vue3,vue3 是可以兼容 vue...
    99+
    2023-06-25
  • Vue3的provide/inject怎么使用
    本文小编为大家详细介绍“Vue3的provide/inject怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3的provide/inject怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思...
    99+
    2024-04-02
  • 怎么使用vue3中的axios
    这篇文章主要讲解了“怎么使用vue3中的axios”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用vue3中的axios”吧!使用 axios 之前,需要先安装好。yarn ...
    99+
    2023-06-25
  • vue3中的$refs怎么使用
    这篇文章主要介绍“vue3中的$refs怎么使用”,在日常操作中,相信很多人在vue3中的$refs怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue3中的$refs怎么使用”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • vue3中的reactive()怎么使用
    本篇内容介绍了“vue3中的reactive()怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!调试版本为3.2.45什么是react...
    99+
    2023-07-04
  • vue3下的watch怎么使用
    对于WatchOptions的参数配置:deep:当需要对对象等引用类型数据进行深度监听时,设置deep: true,默认值是false。immediate:默认情况下watch是惰性的,设置immediate: true时,watch会在...
    99+
    2023-05-17
    Vue3 watch
  • vue3中的createApp怎么使用
    函数定义createApp函数定义在文件 packages/runtime-dom/src/index.ts中export const createApp = ((...args) => { const app = ensureR...
    99+
    2023-05-23
    Vue3 createapp
  • Vue3中的TypeScript怎么使用
    这篇文章主要介绍“Vue3中的TypeScript怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3中的TypeScript怎么使用”文章能帮助大家解决问题。如何声明字段名为枚举的类型?...
    99+
    2023-06-05
  • Vue3中的watch怎么使用
    这篇文章主要介绍“Vue3中的watch怎么使用”,在日常操作中,相信很多人在Vue3中的watch怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3中的watch怎么使用”的疑惑有所帮助!接下来...
    99+
    2023-07-05
  • Vue3中的readonly怎么使用
    在Vue3中,可以通过readonly函数将一个对象转化为只读的,使其属性成为只读的,无法被修改。使用方法如下: import { ...
    99+
    2024-03-08
    Vue3
  • vue3怎么使用defineExpose
    这篇文章主要介绍了vue3怎么使用defineExpose的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue3怎么使用defineExpose文章都会有所收获,下面我们一起来看看吧。可以通过 def...
    99+
    2023-07-05
  • Vue3的Watch和computed怎么使用
    本篇内容介绍了“Vue3的Watch和computed怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • Vue3中的provide、inject怎么使用
    一. 场景再现先别着急考虑标题这个 api 的含义。在这里我先动手写一个比较常见的场景。所对应的组件内部代码比较简单,这里我就不展示了,逻辑上就是 这三个组件层层引用。所对应的页面效果如下:如上图,这是一个在项目中很常见的一个场景,三层嵌套...
    99+
    2023-05-14
    Vue3 provide inject
  • vue3中的ref、reactive怎么使用
    本篇内容主要讲解“vue3中的ref、reactive怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue3中的ref、reactive怎么使用”吧!reactive()基本用法在 Vu...
    99+
    2023-07-05
  • Vue3中Vuex怎么使用
    本篇内容介绍了“Vue3中Vuex怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Vuex是做什么的?Vue官方:状态管理工具状态管理...
    99+
    2023-07-02
  • Vue3中怎么使用TypeScript
    如何声明字段名为枚举的类型?根据设计,type 字段应该是一个枚举值,不应该由调用方随意设置。下面是 Type 的枚举声明,共有 6 个字段。enum Type { primary = "primary", ...
    99+
    2023-05-14
    TypeScript Vue3
  • vue3中getCurrentInstance怎么使用
    父组件中:1.setup语法糖中导入子组件2.在子组件标签上绑定ref值3.setup内部从vue中按需导出 getCurrentInstance 方法4.调用getCurrentInstance方法导出proxy5.通过proxy.$re...
    99+
    2023-05-16
    Vue3 getcurrentinstance
  • Vue3中TypeScript怎么使用
    如何声明字段名为枚举的类型?根据设计,type 字段应该是一个枚举值,不应该由调用方随意设置。下面是 Type 的枚举声明,共有 6 个字段。enum Type { primary = "primary", ...
    99+
    2023-05-18
    TypeScript Vue3
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作