依赖收集器的作用是什么

简介: 【8月更文挑战第28天】依赖收集器的作用是什么

依赖收集器(Dependency Collector)在Vue.js(特别是Vue 2)的响应式系统中起着至关重要的作用。它的核心功能是跟踪和管理哪些“观察者”(watchers)依赖于特定的响应式属性。当这些依赖的属性发生变化时,依赖收集器能够通知所有相关的观察者进行更新。下面,我将通过一段简化的代码来演示依赖收集器的作用。

首先,我们需要定义Dep类,它代表了一个依赖收集器,能够存储并通知依赖于此属性的观察者。

class Dep {
   
    constructor() {
   
        this.subscribers = new Set(); // 使用Set来存储订阅者(观察者)
    }

    // 依赖收集:将观察者添加到订阅者集合中
    depend() {
   
        if (Dep.target) {
   
            this.subscribers.add(Dep.target);
        }
    }

    // 派发更新:通知所有订阅者(观察者)进行更新
    notify() {
   
        this.subscribers.forEach(subscriber => {
   
            subscriber.update();
        });
    }
}

// 全局属性,用于临时存储当前正在计算的watcher
Dep.target = null;

// 模拟一个watcher类
class Watcher {
   
    constructor(vm, expr, cb) {
   
        this.vm = vm;
        this.cb = cb;
        this.value = this.get(expr); // 触发getter,进行依赖收集
        Dep.target = null; // 清理Dep.target
    }

    // 触发getter,进行依赖收集
    get(expr) {
   
        Dep.target = this; // 标记当前watcher为Dep.target
        const value = this.vm._data[expr]; // 假设vm._data是响应式数据
        // 假设这里会触发响应式属性的getter,进而调用dep.depend()
        return value;
    }

    // 更新函数,当依赖的属性变化时会被调用
    update() {
   
        // 这里可以执行DOM更新等逻辑
        console.log('Watcher updated!');
        this.cb(this.vm._data.message); // 假设更新与message属性相关
    }
}

// 响应式属性的实现(简化版)
function defineReactive(obj, key, val) {
   
    const dep = new Dep();

    Object.defineProperty(obj, key, {
   
        get() {
   
            dep.depend(); // 依赖收集
            return val;
        },
        set(newVal) {
   
            if (newVal === val) return;
            val = newVal;
            dep.notify(); // 派发更新
        }
    });
}

// 示例
const vm = {
   
    _data: {
   
        message: 'Hello, Vue!'
    }
};

// 使得_data的属性响应化
Object.keys(vm._data).forEach(key => {
   
    defineReactive(vm._data, key, vm._data[key]);
});

// 创建一个watcher
new Watcher(vm, 'message', function(newValue) {
   
    console.log(`New message value: ${
     newValue}`);
});

// 模拟修改响应式属性
vm._data.message = 'Hello, World!'; // 这将触发watcher的update方法

在上述代码中,Dep类实现了依赖收集器的核心功能:它使用subscribers集合来存储所有订阅了当前依赖的观察者。depend方法用于将当前Dep.target(即当前正在计算的watcher)添加到订阅者集合中,实现依赖收集。而notify方法则遍历订阅者集合,调用每个观察者的update方法,实现派发更新。

Watcher类模拟了一个观察者,它在构造函数中通过get方法访问响应式属性,从而触发依赖收集。当响应式属性变化时,Dep实例的notify方法会被调用,进而通知所有订阅了该属性的观察者进行更新。

请注意,上述代码是高度简化和概念性的,并没有完全模拟Vue.js内部的实际实现。在实际应用中,Vue.js的响应式系统会更加复杂,包括处理数组变化、计算属性、侦听器等多种情况。不过,这段代码足以说明依赖收集器在Vue.js响应式系统中的作用和基本原理。

目录
相关文章
|
10月前
|
消息中间件 存储 运维
云消息队列 Kafka 版全面升级:经济、弹性、稳定,成本比自建最多降低 82%
本文介绍了阿里云云消息队列 Kafka 版的全面升级,强调了其在经济性、稳定性和弹性方面的显著提升。同时,与 Apache Kafka 相比,云消息队列 Kafka 版通过节省 66% 的资源,实现了客户使用成本比自建最多降低 82%。
499 104
|
7月前
|
前端开发 测试技术 API
我同学不知道UnoCSS是什么,我教他用之后效率直接倍增
原子化 CSS 是一种 CSS 的架构方式,它倾向于小巧且用途单一的 class,并且会以视觉效果进行命名。可以将原子化的 CSS 框架理解为这类 CSS 的统称
656 5
|
9月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
540 13
|
缓存 JavaScript 前端开发
Vue的服务端渲染:Vue的服务器端渲染(SSR)技术详解
【4月更文挑战第24天】Vue的服务器端渲染(SSR)能解决SPA的首屏加载和SEO问题。SSR预渲染HTML,提升首屏速度,改善SEO,提供更好的用户体验。Nuxt.js是Vue的SSR框架,简化开发流程。但SSR增加服务器压力,开发成本高,且需处理缓存问题。选择SSR需权衡优劣。本文旨在帮助理解Vue SSR原理、优势及实践方法。
|
11月前
|
机器学习/深度学习 供应链 Python
使用Python实现深度学习模型:智能供应链管理与优化
使用Python实现深度学习模型:智能供应链管理与优化 【10月更文挑战第4天】
611 0
使用Python实现深度学习模型:智能供应链管理与优化
|
存储 机器人 API
Nvidia Isaac Sim图形界面 入门教程 2024(3)
本文是Nvidia Isaac Sim图形界面的入门教程,介绍了Isaac Sim GUI的界面组件、基本操作、物体和视角调整方法,并通过实例演示了如何创建和变换物体、构造铰接式物体以及调整环境和视角。
2033 0
|
Java 测试技术 Shell
FunASR英文离线文件转写软件包问题之软件包安装问题如何解决
FunASR英文离线文件转写软件包问题之软件包安装问题如何解决
216 0
|
缓存 网络协议 Windows
一分钟解决Github连接慢或者无法连接,亲测有效!
一分钟解决Github连接慢或者无法连接,亲测有效!
5531 0
一分钟解决Github连接慢或者无法连接,亲测有效!
|
JavaScript
vue3中$attrs的变化与inheritAttrs的使用
vue3中$attrs的变化与inheritAttrs的使用