我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue3里的EffectScope怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue3里的EffectScope怎么使用

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怎么使用的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue3里的EffectScope怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue3里的EffectScope怎么使用

Vue3.2版本引入了新的EffectscopeAPI,使用effectScope创建一个effect作用域,可以捕获其中所创建的响应式副作用(即计算属性和侦听器),这样捕获到的副作用可以一起处理。使用getCurrentScope返回当前活跃的effect作用域。使用onScopeDispose在当前活跃的effect作用域上注册一个处理回调函数。当相关的effect作用域停止时会调用这个回调函数。constscope=effectScope()scope.run(()=>{constd
2023-05-17

深入理解Vue3里的EffectScope

本文主要介绍了Vue3里的EffectScope,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

怎么使用vue3的setup()

本篇内容主要讲解“怎么使用vue3的setup()”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用vue3的setup()”吧!从 vue2 升级到 vue3,vue3 是可以兼容 vue
2023-06-25

Vue3中的watch怎么使用

这篇文章主要介绍“Vue3中的watch怎么使用”,在日常操作中,相信很多人在Vue3中的watch怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue3中的watch怎么使用”的疑惑有所帮助!接下来
2023-07-05

vue3下的watch怎么使用

既然是数据监听,监听的是它的变化。那么就需要能够捕获它的变更,于是监听的数据必然要是响应式数据watch(WatcherSource,Callback,[WatchOptions])参数:WatcherSource:想要监听的响应式数据。Callback:执行的回调函数,入参(newValue,oldValue)。[WatchOptions]:deep、immediate、flush可选。对于WatchOptions的参数配置:deep:当需要对对象等引用类型数据进行深度监听时,设置deep:t
2023-05-17

Vue3中的TypeScript怎么使用

这篇文章主要介绍“Vue3中的TypeScript怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3中的TypeScript怎么使用”文章能帮助大家解决问题。如何声明字段名为枚举的类型?
2023-06-05

vue3中的createApp怎么使用

函数定义createApp函数定义在文件packages/runtime-dom/src/index.ts中exportconstcreateApp=((...args)=>{constapp=ensureRenderer().createApp(...args)if(__DEV__){injectNativeTagCheck(app)injectCompilerOptionsCheck(app)}const{mount}=appapp.mount=(containerOrSelector
2023-05-23

vue3中的$refs怎么使用

这篇文章主要介绍“vue3中的$refs怎么使用”,在日常操作中,相信很多人在vue3中的$refs怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue3中的$refs怎么使用”的疑惑有所帮助!接下来
2023-06-29

vue3中的reactive()怎么使用

本篇内容介绍了“vue3中的reactive()怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!调试版本为3.2.45什么是react
2023-07-04

Vue3中的readonly怎么使用

在Vue3中,可以通过readonly函数将一个对象转化为只读的,使其属性成为只读的,无法被修改。使用方法如下:import { readonly } from 'vue';const myObject = { nam
Vue3中的readonly怎么使用
2024-03-08

怎么使用vue3中的axios

这篇文章主要讲解了“怎么使用vue3中的axios”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用vue3中的axios”吧!使用 axios 之前,需要先安装好。yarn add a
2023-06-25

vue3怎么使用defineExpose

这篇文章主要介绍了vue3怎么使用defineExpose的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue3怎么使用defineExpose文章都会有所收获,下面我们一起来看看吧。可以通过 defineEx
2023-07-05

vue3中的ref、reactive怎么使用

本篇内容主要讲解“vue3中的ref、reactive怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue3中的ref、reactive怎么使用”吧!reactive()基本用法在 Vu
2023-07-05

Vue3中TypeScript怎么使用

如何声明字段名为枚举的类型?根据设计,type字段应该是一个枚举值,不应该由调用方随意设置。下面是Type的枚举声明,共有6个字段。enumType{primary="primary",success="success",warning="warning",warn="warn",//warningaliasdanger="danger",info="info",}TypeSc
2023-05-18

vue3中localStorage怎么使用

在Vue3中,可以通过以下方式来使用localStorage:1. 获取localStorage的值:```javascriptconst value = localStorage.getItem('key');```2. 设置localS
2023-08-09

vue3中getCurrentInstance怎么使用

父组件中:1.setup语法糖中导入子组件2.在子组件标签上绑定ref值3.setup内部从vue中按需导出getCurrentInstance方法4.调用getCurrentInstance方法导出proxy5.通过proxy.$refs.子组件ref名.子组件内属性/方法实现调用子组件count+1import{getCurrentInstance,ComponetInternalInstance,ref}from"vue";importChildfrom"./
2023-05-16

vue3中怎么使用swiper

今天小编给大家分享一下vue3中怎么使用swiper的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。介绍在 vue3 中使用
2023-07-05

Vue3中的provide、inject怎么使用

一.场景再现先别着急考虑标题这个api的含义。在这里我先动手写一个比较常见的场景。所对应的组件内部代码比较简单,这里我就不展示了,逻辑上就是这三个组件层层引用。所对应的页面效果如下:如上图,这是一个在项目中很常见的一个场景,三层嵌套的组件。(其实还有深层次的嵌套,目前我们拿三层嵌套举例足矣)ok,你现在的需求是:在爷爷组件内需要提供一个字符串数据“韩振方”去提供给儿子组件使用。聪明的你肯定想到了props,废话不多说,我们直接上手。二.传递Props“我以为多高深呢,这不就是数据父传子的场景吗?
2023-05-14

编程热搜

目录