IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue3 的依赖收集原理 -> 正文阅读

[JavaScript知识库]vue3 的依赖收集原理

总结来说: vue使用模块全局变量来进行依赖收集

极简版的vue3 依赖收集源码

// 以vue3 ref为例
// 定义响应式对象, 对外接口 ref
function ref(value) {
    return createRef(value)
}

function createRef(value) {
    return new RefImpl(value)
}

class RefImpl {
    constructor(value) {
        this._value = value
    }
    get value() {
        track(this, 'value')
        return this._value
    }
    set value(newVal) {
        this._value = newVal
        trigger(this, 'value')
    }
}


// 依赖收集部分
const targetMap = new WeakMap()
let activeEffect
function track(target, key) {
    let depMap = targetMap.get(target)
    if (!depMap) {
       targetMap.set(target, (depMap = new Map())) 
    }
    let deps = depMap.get(key)
    if (!deps) {
        depMap.set(key, deps = new Set())
    }
    if(activeEffect) {
        deps.add(activeEffect)
        activeEffect.deps.push(deps)
    }
}


// 副作用部分
function effect(fn) {
    const effect1 = createReactiveEffect(fn)
    effect1()
}

function createReactiveEffect(fn) {
    const effect =  function reactiveEffect() {
        activeEffect = effect
        return fn()
    }
    effect.deps = []
    return effect
}
// trigger
function trigger(target, key) {
    const depMap = targetMap.get(target)
    if (!depMap) return
    const deps = depMap.get(key)
    deps.forEach(dep => {
        dep()
    })
}
  1. 对外暴漏两个api, ref 和effect
  2. ref用于创建一个基本值的包装对象RefImpl的实例
  3. RefImpl的getter中会触发依赖收集
  4. RefImpl的getter中会触发包装对象,也就是值的订阅者
  5. effec会创建一个effect的函数, 并且立即执行一次,把全局变量activeEffect设置为本身, 并在effect中执行订阅函数
  6. 订阅函数会立即触发ref的getter, 从而触发track,把当前的effect加入订阅者列表里
  7. 当ref实例的value改变时, 会触发trigger,从而触发订阅者

github链接

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:07:20  更:2021-07-27 16:08:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 3:47:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码