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

深入理解Vue3里的EffectScope

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

深入理解Vue3里的EffectScope

Vue 3.2 版本引入了新的 Effect scope API,使用 effectScope 创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理。使用 getCurrentScope 返回当前活跃的 effect 作用域。使用 onScopeDispose 在当前活跃的 effect 作用域上注册一个处理回调函数。当相关的 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 stopWatch1 = watchEffect(() => {
  console.log(`counter: ${counter.value}`)
})

disposables.push(stopWatch1)

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

disposables.push(stopWatch2)

上面的代码中,我们写了一共三个 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 又有影响,其他 component2 组件调用有问题。

到此这篇关于深入理解Vue3里的EffectScope的文章就介绍到这了,更多相关Vue3 EffectScope内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

深入理解Vue3里的EffectScope

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

下载Word文档

猜你喜欢

深入理解Vue3里的EffectScope

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

Vue3里的EffectScope怎么使用

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

深入理解vue3中的reactive()

本文主要介绍了深入理解vue3中的reactive(),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-17

深入理解Vue3响应式原理

响应式就是当对象本身(对象的增删值)或者对象属性(重新赋值)发生变化时,将会运行一些函数,最常见的就是render函数,下面这篇文章主要给大家介绍了关于Vue3响应式原理的相关资料,需要的朋友可以参考下
2022-12-19

深入了解Vue3中props的原理与使用

props指父组件往子组件中传入参数,这篇文章主要为大家介绍了vue3中props的原理与使用,文中的示例代码讲解详细,感兴趣的可以了解一下
2023-05-19

一文带你深入理解Vue3响应式原理

响应式就是当对象本身(对象的增删值)或者对象属性(重新赋值)发生变化时,将会运行一些函数,最常见的就是render函数,下面这篇文章主要给大家介绍了关于Vue3响应式原理的相关资料,需要的朋友可以参考下
2022-11-13

由浅入深讲解vue2和vue3的区别

最近发现很多要求Vue3的技术了,不得不说it技术的更新真的太快了,作为vue2老用户,我们在学习Vue3前应该了解他们的区别以及背后的原因,下面这篇文章主要给大家介绍了关于vue2和vue3区别的相关资料,需要的朋友可以参考下
2023-02-08

深入聊聊vue3中的reactive()

前言:在vue3的开发中,reactive是提供实现响应式数据的方法。日常开发这个是使用频率很高的api。这篇文章笔者就来探索其内部运行机制。
2023-05-14

深入详解Vue3中的Mock数据模拟

这篇文章主要为大家介绍了深入Vue3中的Mock数据模拟实现细节详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-19

怎么深入解析Vue3中的diff 算法

今天给大家介绍一下怎么深入解析Vue3中的diff 算法。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。1.0 diff 无key子节点在处理被标记为UNKE
2023-06-26

深入理解阿里云数据库

简介:阿里云数据库是阿里云提供的一种基于云计算技术的数据库服务,为用户提供了丰富的数据库功能和管理工具,帮助用户快速构建和部署数据库应用程序。本文将深入探讨阿里云数据库的内容,包括数据库类型、数据库实例、数据库备份和恢复等方面。数据库类型:阿里云数据库提供了多种数据库类型,包括关系型数据库(如MySQL)、NoSQL数
深入理解阿里云数据库
2024-01-24

深入理解JavaScriptCore

动态化作为移动客户端技术的一个重要分支,一直是业界积极探索的方向。目前业界流行的动态化方案,如Facebook的React Native,阿里巴巴的Weex都采用了前端系的DSL方案,而它们在iOS系统上能够顺利的运行,都离不开一个背后的功
2023-06-03

深入理解MessageQueue

MessageQueue是一种用于线程间通信的机制,可以将消息从一个线程传递到另一个线程。它主要由两部分组成:消息队列和消息循环。消息队列是一个存储消息的容器,它可以存储多个消息,并按照先进先出的顺序进行处理。每个消息都包含一个标识符和一些
2023-09-28

深入理解quilljs

Quill.js是一个用于构建富文本编辑器的JavaScript库。它提供了许多强大的功能,使开发人员能够轻松地创建具有格式化文本、插入图片、添加链接等功能的编辑器。下面是一些深入理解Quill.js的关键概念和功能:1. Delta格式:
2023-09-22

java String的深入理解

java String的深入理解一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。 JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在
2023-05-31

深入理解阿里云服务器WCS

本文将深入介绍阿里云服务器WCS(WebContainerService)的基本概念、特点、优势以及如何使用它。正文:随着互联网的不断发展,Web应用的复杂度和规模也在不断提高。为了满足日益增长的Web应用需求,云服务已经成为主流。阿里云服务器WCS就是一种基于容器技术的云服务器服务,它具有高度的可扩展性、可移植
深入理解阿里云服务器WCS
2023-11-12

编程热搜

目录