美文网首页
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