Vue响应式进阶常用API之effectScope、getCurrentScope、onScopeDispose学习

effectScope

官方解释:创建一个 effect 作用域,可以捕获其中所创建的响应式副作用 (即计算属性和侦听器),这样捕获到的副作用可以一起处理。

具体解释:就是创建一个effct作用域,当需要的时候可以调用里面的监听、计算熟悉等,不需要的时候可以清空

getCurrentScope

获取当前组件是否还有活动的effect,可以用在onBeforeUnmount、onUnmounted等钩子中

onScopeDispose

当前页面或组件注销时会触发 onScopeDispose 事件

示例:

javascript 复制代码
<template>
  <h2>进阶练习</h2>
  <div>
    <div>姓名: {{ data.name }}</div>
    <div>年龄: {{ data.age }}</div>
    <div>个人信息:{{ data.info }}</div>
    <button @click="handleChange(data.age)">修改信息</button>
  </div>
</template>

<script setup>
import { reactive, effectScope, watch, getCurrentScope, onUnmounted, onScopeDispose } from 'vue'
const baseObj = {
  name: 'Alan',
  age: 18,
  job: '码农',
  info: ''
}
const data = reactive(baseObj)

const effect = effectScope()
// 获取当前effect实例, 当前组件是否还有活动的effect,可以用在onBeforeUnmount、onUnmounted等钩子中
const allScope = getCurrentScope()

effect.run(() => {
  watch(
    () => data.age,
    () => {
      data.info = `${data.name}现在${data.age}岁了`
    }
  )
})

console.log('当前组件是否有活动effect', allScope.active)
onUnmounted(() => {
  // 停止当前作用域内所有的effect
  allScope.stop()
})
// 当前页面或组件注销时会触发 onScopeDispose 事件
onScopeDispose(() => {
  // allScope.stop()
  console.log('当前组件注销了, 已停止effect所有侦听')
})
const handleChange = (age) => {
  if (age >= 23) {
    // 处理掉当前作用域内的所有effect
    effect.stop()
  } else {
    data.age += 1
  }
}
</script>
相关推荐
IZero0716 分钟前
Elasticsearch 学习笔记筑基-文档操作篇
笔记·学习·elasticsearch
IT_陈寒18 分钟前
被Java的final坑惨了,这些细节你可能也忽略了
前端·人工智能·后端
kyriewen41 分钟前
我带着DeepSeek Harness跑了一周真实需求——这份避坑速查表请收好
前端·ai编程·deepseek
计算机魔术师1 小时前
OpenAI不单独发o3了,Altman说GPT-5才是终局
前端
一座古城1 小时前
Claude Code 架构源码解析:AI 应用开发的范式跃迁
前端·后端
K哥爬虫1 小时前
【JS 逆向百例】Vaptcha V4 手势验证码逆向分析
前端·后端
用户921080262861 小时前
复盘 AI Coding 工作台的流式链路:从 Sender 输入到 SSE 分流,再到 BubbleList 和右侧预览
前端
了不起的小明1 小时前
SwiftMesh:本地 3D 模型查看器,加密交付 + 转盘录屏一站式搞定,开源免费
前端
默_笙2 小时前
👍 我的代码被 ESLint 抓包了:单引号、var、没分号——全被当场点名
前端·javascript
搞个锤子哟2 小时前
vue项目引入icon的问题
前端