当前位置: 首页 > news >正文

【vue3】嵌套的 effect 与 effect 栈

在 Vue 3 的响应式系统中,effect 是一个非常重要的概念。effect 是一个函数,它接受一个执行副作用(side effect)的函数作为参数,并返回一个可以停止这个副作用的函数。当响应式数据发生变化时,Vue 3 会自动重新运行相关的 effect,从而触发组件的重新渲染或执行其他相关的逻辑。

当我们在一个 effect 内部创建另一个 effect 时,就形成了嵌套的 effect。Vue 3 通过维护一个 effect 栈来处理这种情况。这个栈用于跟踪当前正在运行的 effect,以便在响应式数据发生变化时能够正确地重新运行它们。

下面是一个简单的示例来说明嵌套的 effect 和 effect 栈的概念:

import { ref, effect, onMounted } from 'vue';const count = ref(0);onMounted(() => {const outerEffect = effect(() => {console.log('Outer effect running');const innerEffect = effect(() => {console.log('Inner effect running');console.log('Count:', count.value);});// 模拟一些操作,比如改变 count 的值count.value++;// 停止内部 effect(如果需要的话)// innerEffect();});// 停止外部 effect(如果需要的话)// outerEffect();
});

在这个例子中,我们定义了一个响应式引用 count,并在组件挂载时创建了一个外部 effect(outerEffect)。在这个外部 effect 内部,我们又创建了一个内部 effect(innerEffect)。

当外部 effect 第一次运行时,它会输出 “Outer effect running”,然后运行内部 effect。内部 effect 会输出 “Inner effect running” 和当前的 count 值。由于 count 是一个响应式数据,当它的值发生变化时,Vue 3 会重新运行与之相关的 effect。

effect 栈的作用在于确保当响应式数据发生变化时,能够按照正确的顺序重新运行嵌套的 effect。在这个例子中,如果 count 的值发生变化,首先会重新运行内部 effect(因为它直接依赖于 count),然后重新运行外部 effect(因为它创建了内部 effect)。

通过维护 effect 栈,Vue 3 能够处理复杂的响应式逻辑,并确保在数据变化时能够正确地触发相关的副作用。这对于构建高效且可维护的 Vue 3 应用至关重要。

相关文章:

  • 【spring】@ControllerAdvice注解学习
  • 【设计模式】桥接模式
  • 小皮面板中访问不了本地的sqli网站---解决方法
  • 【Andoird开发】android获取蓝牙权限,搜索蓝牙设备MAC
  • Reactor设计模式
  • P3128 [USACO15DEC] Max Flow P题解(树上差分,最近公共祖先,图论)
  • Golang | Leetcode Golang题解之第111题二叉树的最小深度
  • Python | Leetcode Python题解之第111题二叉树的最小深度
  • Python基础学习笔记(七)——元组
  • python从入门到精通02
  • SELINUX=enforcing时无法启动httpd服务的解决方案(semanage命令以及setroubleshoot-server插件的妙用)
  • 门禁-jenkins的构建状态同步到gitlab提交流水线
  • C++中的模板类的定义与使用
  • win11 通过防火墙设置-开通本地端口
  • Linux Tcpdump抓包入门
  • web标准化(下)
  • 关于extract.autodesk.io的一些说明
  • 坑!为什么View.startAnimation不起作用?
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 如何设计一个微型分布式架构?
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 实现菜单下拉伸展折叠效果demo
  • 思否第一天
  • 小李飞刀:SQL题目刷起来!
  • 用Visual Studio开发以太坊智能合约
  • #if 1...#endif
  • #NOIP 2014# day.1 T2 联合权值
  • #前后端分离# 头条发布系统
  • #职场发展#其他
  • $.proxy和$.extend
  • (1) caustics\
  • (12)目标检测_SSD基于pytorch搭建代码
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (论文阅读30/100)Convolutional Pose Machines
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Micro Framework初体验(二)
  • .net 简单实现MD5
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET文档生成工具ADB使用图文教程
  • @Data注解的作用
  • @Responsebody与@RequestBody
  • @Transactional 详解
  • @Validated和@Valid校验参数区别
  • [1127]图形打印 sdutOJ
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Android Pro] AndroidX重构和映射
  • [C++]类和对象【下】
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现