vue3的api解读-effect scope

news/2024/11/17 19:00:20/

什么是scope

  • 英文:范围
  • 举例:变量的可见范围(variable scope)
  • 举例:闭包内变量的可见范围是词法作用域(lexical scope)
  • 举例:slot-scope绑定的变量的可见范围是template内部

effect scope

  • 人为设置一个范围,对其内部的所有effect进行管理【可见,集中处理】
const scope = effectScope()
scope.run(()=>{// 副作用1const doubled = computed(()=> couter.value * 2) // 副作用2watch(doubled, ()=> console.log(doubled.value))// 副作用3watchEffect(() => console.log('Count:', doubled.value))
})// to dispose all effects in the scope; 
// 处理范围中的所有效果; 一次性注销掉副作用1, 2, 3
scope.stop()

effect scope示例讲解

effect scope的用法【使用场景比较窄】

  • Coding:实现控制MouseMove事件的开关

/src/examples/ScopeExamples.tsx

import {defineComponent,effectScope,watch,watchEffect,ref,reactive,toRefs,onUnmounted,// 组件卸载时候的钩子onScopeDispose,
} from "vue"
import type {Ref,EffectScope
} from "vue"
export const ScopeExample01 = defineComponent({setup() {// 如果第一个参数传true,那就不听父域的管了。const scope = effectScope()const c = ref(0)scope.run(() => {watch(c, () => {console.log('watch effect', c.value)})})setInterval(() => {c.value++}, 300)setTimeout(() => {scope.stop()}, 2000)return () => {return <div>{c.value}</div>}}
})
export const ScopeExample02 = defineComponent({setup() {const scope = effectScope()const c = ref(0)scope.run(() => {const subScope = effectScope() // 可以嵌套subScope.run(() => {watch(c, () => {console.log('watch effect', c.value)})})})setInterval(() => {c.value++}, 300)setTimeout(() => {// 父域作用停止,子域也停止// 如果第一个参数传true,那就不听父域的管了。// effectScope(true)scope.stop()}, 2000)return () => {return <div>{c.value}</div>}}
})
function useMouseMove() {const point = reactive({ x: 0, y: 0 })function handler(e: MouseEvent) {point.x = e.clientXpoint.y = e.clientY}window.addEventListener("mousemove", handler)onScopeDispose(() => { // scope.stop(),就会执行它window.removeEventListener("mousemove", handler)})return toRefs(point)
}
export const ScopeExample03 = defineComponent({setup() {let point: {x: Ref<number>,y: Ref<number>} | null = null // point开始是null所以第一次渲染没有存依赖let scope: EffectScope | null = nullconst active = ref(false)watch(active, () => {if (active.value) {scope = effectScope()point = scope.run(() => {return useMouseMove()})! // 后面这个!是断言不可能为null} else {scope?.stop() // 存在,就停止point = null}})return () => {return <div>{active.value && <span> point is :  {point?.x.value}, {point?.y.value}</span>}<button onClick={() => {active.value = !active.value}}>toogle</button></div>}}
})
function useMouseMove1() { // 更好的封装,不用scopeconst point = reactive({ x: 0, y: 0 })const active = ref(false)function handler(e: MouseEvent) {point.x = e.clientXpoint.y = e.clientY}watch(active, () => {if (active.value) {window.addEventListener("mousemove", handler)} else {window.removeEventListener("mousemove", handler)}})return {...toRefs(point),active}
}
export const ScopeExample04 = defineComponent({setup() {const { x, y, active } = useMouseMove1() // point开始是null所以第一次渲染没有存依赖let scope: EffectScope | null = nullreturn () => {return <div>{active.value && <span> point is :  {x.value}, {y.value}</span>}<button onClick={() => {active.value = !active.value}}>toogle</button></div>}}
})
  • 思考:
    • 这个场景不用Scope行不行?可以呀,在useMouseMove(),提供个开关就可以了
    • 这样的场景多不多?很少

http://www.ppmy.cn/news/300615.html

相关文章

opengl学习笔记

摘自www.opengl.org楼主会不定时更新 OpenGL编程指南OpenGL编程指南 学习OpenGL的官方指南1.1版 关于本指南 第一章OpenGL简介 第二章国家管理和绘制几何对象 第3章查看 第4章颜色 第5章照明 第6章混合&#xff0c;抗锯齿&#xff0c;雾化和多边形偏移 第7章显示列表 第八章绘制…

ajax常用的api测试

ajax常用的api测试 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/IT_Mr_wu/article/details/102988178 ajax的常用api测试 AjaxApi 下面列出的接口…

ajax的常用api测试

ajax的常用api测试 AjaxApi 下面列出的接口基本都是可以直接使用的&#xff0c;如有问题记得告诉我哦 支持的请求方法 GET&#xff08;SELECT&#xff09;&#xff1a;从服务器取出资源&#xff08;一项或多项&#xff09;。POST&#xff08;CREATE&#xff09;&#xff1a…

4个Github上的沙雕开源项目

我们的程序员小哥哥不仅会写代码&#xff0c;思维逻辑严密&#xff0c;在风趣幽默这一行也不输任何人呀&#xff0c;这不&#xff0c;在GitHub上面看到的这几个项目&#xff0c;不得不说&#xff0c;他们真的很会&#xff0c;左手祖传代码&#xff0c;右手手握有趣的开源项目&a…

鸿蒙 HAIWEI DevEco Studio 安装配置,运行Hello World!

鸿蒙开发 前言正文一、下载二、安装三、配置四、运行 前言 2019年8月9日&#xff0c;华为在HDC开发者大会上正式发布鸿蒙系统。 2020年9月10日&#xff0c;华为在HDC开发者大会上如约发布鸿蒙 2.0&#xff0c;并面向应用开发者发布Beta版本。明年鸿蒙将全面支持华为手机。 正…

Github上看到的4个好玩的开源项目

点击上方“Github爱好者社区”&#xff0c;选择星标 回复“资料”&#xff0c;获取小编整理的一份资料 我们的程序员小哥哥不仅会写代码&#xff0c;思维逻辑严密&#xff0c;在风趣幽默这一行也不输任何人呀&#xff0c;这不&#xff0c;在GitHub上面看到的这几个项目&#xf…

python 学习目录

第1章 搭建开发环境实战 1.1 安装Python环境 范例01-01&#xff1a;在Windows系统中下载并安装Python 范例01-02&#xff1a;在Mac OS系统中下载并安装Python 范例01-03&#xff1a;在Linux系统中下载并安装Python 1.2 安装开发工具 范例01-04&#xff1a;使用Python自带…

我在微软的这六个月

大家好&#xff0c;我是菜鸟哥&#xff01; 时间过的好快&#xff0c;转眼间假期就要结束了&#xff0c;得赶快收拾一下假期的倦怠感卷起来了&#xff01; PS&#xff1a;假期看了不少电影&#xff0c;真的是把瘾全过了。《洛奇》、《指环王》、《霍比特人》这些电影是真不错。…