美文网首页
vue3源码手写-effect实现

vue3源码手写-effect实现

作者: 未来在奋斗 | 来源:发表于2023-04-02 21:06 被阅读0次

    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)
        }
    }
    
    

    相关文章

      网友评论

          本文标题:vue3源码手写-effect实现

          本文链接:https://www.haomeiwen.com/subject/hlorddtx.html