vue3源码手写-effect实现


title: vue3源码手写-effect实现
date: 2023-04-03 21:00:00
categories: 源码
tags: VUE3


vue3源码手写-effect实现

1. packages\reactivity\src\effect.ts

第一步在 packages\reactivity\src\effect.ts 创建effect文件,effect做的就是依赖收集对get set put等操作进行收集


export function effect(fun,options:any={}){
const  effect = creatReactEffect(fun,options)
// 不是懒执行 直接执行
    if(!options?.lazy){
        effect()
    }

}
//  定义属性用作区分。每个属性都会有自己的uid
let uid = 0
// 储存当前的effect
let activeEffect
function creatReactEffect(fun,options){
    const effect = function reactEffect(){
        activeEffect=effect
        fun()
    }
    effect.id = uid++; //区分effect
    effect._isEffect = true//区分effect 是不是响应式
    effect.raw = fun//保存传进来的方法
    effect.options = options//保存传进来的属性
    return effect
}

// 收集依赖effect 在获取数据的时候触发get 收集effect
let targetMap= new WeakMap()
export function track(target,type,key){
    // 是undefined则说明没有调用或者不是响应数据
    if(activeEffect === undefined) return 
    // 获取effect {target:dep}
    let depMap = targetMap.get(target)
    if(!depMap){
        // 没有 depMap 说明第一次调用
        targetMap.set(target,(depMap= new Map))
    }
    // 有depMap 就要判断有没有收集属性依赖
    let dep = depMap.get(key)
    if(!dep){
        // 没有收集属性依赖就要添加
        depMap.set(key,(dep= new Set))
    }
    // 有属性要看看依赖收集没有
    if(!dep.has(activeEffect)){
        // 没有要添加
        dep.add(activeEffect)
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容