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>
相关推荐
锐湃15 小时前
手写agp8自定义插件,用ASM实现路由跳转
java·服务器·前端
Dfreedom.15 小时前
循阶而上,庖丁解牛:系统学习开源 AI 模型的行动指南
人工智能·深度学习·学习·开源·图像算法
wordbaby15 小时前
TypeScript 类型断言和类型注解的区别
前端·typescript
谁是听故事的人15 小时前
vue前端面试指南
前端·vue.js·面试
紫罗兰盛开15 小时前
python学习笔记
笔记·学习
名字被你们想完了16 小时前
Flutter 实现一个容器内部元素可平移、缩放和旋转等功能(十)
前端·flutter
千寻girling16 小时前
面试官: “ 请你讲一下 package.json 文件 ? ”
前端·javascript·面试
如果你好16 小时前
解决深拷贝循环引用痛点:一篇看懂 WeakMap 实现方案
前端·javascript
走在路上的菜鸟16 小时前
Android学Dart学习笔记第二十七节 异步编程
android·笔记·学习·flutter
han_16 小时前
前端性能优化之性能指标篇
前端·javascript·性能优化