vue2源码--依赖收集

vue2源码–依赖收集

Dep

Dep是用来收集渲染的变量的。比如 {{age}} {{text}} 需要渲染,但是在后续中改变了age, text, 以及hobby这个变量,只会收集需要渲染的数据。

Watcher

通知dep的变化,被dep收集
一个dep可以有多个watcher 一个属性可以在多个组件中使用
一个watcher也可以有多个dep 一个组件可以使用多个属性
Observer 将数据定义为响应式,每个 Observer 实例都有自己的 Dep 来管理依赖。实例化 Wacther 的时候进行求值会触发 getter ,进而执行 dep.depend() 将当前 Wacther 加入 Dep 维护的依赖列表,这就是依赖收集过程。
数据发生变化触发 setter 执行 dep.notify,Dep 会执行所有依赖的 update 方法并加入异步更新队列,这就是触发依赖过程。

渲染的原理

  1. 将render函数传入watcher
  2. render函数执行get()函数
  3. 渲染数据,每个数据都有dep,只有被渲染的才会有dep.id
  4. 依次渲染数据,渲染完毕,将dep.target设置为null
  5. 如有变更,会重新执行渲染函数,即重新watcher。

dep.js

let id = 0
class Dep {constructor() {this.id = id++this.subs = []}addSub(watcher) {console.log(7)console.log("{addSub  dep}")// 记录watcherthis.subs.push(watcher)}depend() {// this.subs.push(Dep.target)console.log("{depend}")Dep.target.addDep(this)}notify() {console.log('{notify}')this.subs.forEach(watcher => watcher.update())}
}
Dep.target = null
export default Dep

watcher.js

import Dep from './dep'let id = 0
class Watcher {constructor(vm, exprOrFn, options) {  //vm是实例, exprOrFn是render函数。this.id = id++this.renderWatcher = options  // offthis.getter = exprOrFn // 调用这个函数,可以发生取值操作this.deps = [] // 计算属性和清理工作this.depsId = new Set()  // 去重this.get()}addDep(dep) {console.log(5)console.log(dep)console.log("[addDep watcher]")let id = dep.idif (!this.depsId.has(id)) {console.log(6)this.deps.push(dep)this.depsId.add(id)dep.addSub(this)}}get() {console.log("[get]")Dep.target = thisconsole.log(1)this.getter()Dep.target = null}update() {console.log("[update]")this.get()}
}
export default Watcher

observe/index.js

import {newArrayProto} from "./array";
import Dep from "./dep";class Observer {constructor(data) {// data.__ob__ = thisthis.dep = new Dep()Object.defineProperty(data, '__ob__', {value:this,enumerable:false})if (Array.isArray(data)) {data.__proto__ = newArrayProto} else{this.walk(data)}}walk(data) {Object.keys(data).forEach(key => {// debuggerdefinedReactive(data,key,data[key])})}observeArray(data) {data.forEach(item => observe(item))}
}
export function definedReactive(target, key, value) {observe(value)let dep = new Dep()Object.defineProperty(target, key, {get() {if (Dep.target) {console.log(4)console.log("value", value)dep.depend()}return value},set(newValue) {if(value === newValue) returnobserve(newValue)value = newValuedep.notify()}})
}
export function observe(data) {if (typeof data !== 'object' || data == null) {return}if (data.__ob__ instanceof Observer) {return data.__ob__}return new Observer(data)
}

上面代码中的console.log(1)等等可以帮助理解代码逻辑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习【零拷贝】这一篇就够了

目录 1. 什么是零拷贝2. 传统的IO执行流程3. 零拷贝相关知识3-1. 内核空间和用户空间3-2. 什么是用户态、内核态3-3. 什么是上下文切换3-4. 虚拟内存3-5. DMA技术 4. 零拷贝实现的几种方式4-1. mmapwrite实现的零拷贝4-2. sendfile实现的零拷贝4-3. sendfileDMA scatter/gather…

深度学习网络缝合模块学习

主干网络缝合模块------>缝模块对其通道数 1缝合模块只看通道数 2把模块复制到模型中 3在forward中查看通道数是多少 4在init中进行实例化,注意通道数是上一步forward的通道数 5在forward中加载init中的实例化 6模型实例化测试模块是否加入 模块和模块之前…

程序数据模型由OS还是硬件架构决定?

文章目录 前言硬件架构的作用OS的作用编译器的角色OS的数据模型参考 前言 在文章 1>>32的结果是1还是0 中提到了数据模型 L P 64 LP64 LP64 ,并提出这个数据模型主要是由 U n i x Unix Unix 以及类 U n i x Unix Unix 的操作系统使用居多,例如…

C++教学——从入门到精通 6.ASCII码与字符型

如何把小写字母转换成大写字母呢? 这个问题问的好,首先我们要新学一个类型——char 这个类型就是字符型 再来说说ASCII码 给大家举几个例子 空格————32 0————48 9————57 A————65 Z————90 a————97 z————122 我们…

若依框架学习使用

若依官网项目拉取下来介绍 | RuoYi 项目运行: 1.idea安装,可以运行前后端 编辑器idea、jdk环境安装、数据库mysql、navicat工具、redis(redis-server启动)安装 2.navicat数据库连接, 创建数据库ry-vue并导入数据脚本ry_2021xxxx.sql,qua…

二. CUDA编程入门-Stream与Event

目录 前言0. 简述1. 执行一下我们的第九个CUDA程序2. Stream是什么3. Streams实验(单流vs多流)4. 如何隐藏延迟(memory)5. 如何隐藏延迟(kernel)6. 如何隐藏延迟(kernelmemory)7. 代码分析总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记…

达梦数据库ODBC驱动安装和配置

达梦数据库ODBC驱动安装和配置 ODBC安装和配置测试连接 ODBC安装和配置 将ODBC驱动安装包解压到安装路径下: mv unixODBC-2.3.0.tar.gz /opt cd /opt && tar -zvxf unixODBC-2.3.0.tar.gz 使用root用户编译安装ODBC驱动: cd /opt/unixODBC-2.…

MD5 计算 (下一代加密辅助类, Win32, C++)

CCNGHelper.h #pragma once #include <string> #include <tchar.h> #include <windows.h> #include <bcrypt.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 下一代加密辅助类 // 客户端: Windows Vi…

7种2024年算法优化BP,实现回归,单/多变量输入,单/多步预测功能,机器学习预测全家桶再更新!...

截止到本期MATLAB机器学习预测全家桶&#xff0c;一共发了19篇关于机器学习预测代码的文章。算上这一篇&#xff0c;一共20篇&#xff01;参考文章如下&#xff1a; 1.五花八门的机器学习预测&#xff1f;一篇搞定不行吗&#xff1f; 2.机器学习预测全家桶&#xff0c;多步预测…

wails 创建Go 项目

##wails是一个可以让go和web技术编写桌面应用#安装wails go install github.com/wailsapp/wails/v2/cmd/wailslatest#检查环境 wails doctor 创建项目wails init -n AuxiliaryTools -t vue-ts拉取go.mod的依赖项 go mod tidy进入 frontend 前端安装依赖项npm install /pnpm ins…

React组件及组件通讯

组件使用 index.js import { createRoot } from react-dom/client; import App from ./App; const root createRoot(document.querySelector(#root)) root.render(<App />)App.js import Header from ./commponts/Header/index const App () > {return <div&g…

一致性广播、可靠广播、原子广播、安全因果原子广播以及与拜占庭协议结合

在分布式系统中&#xff0c;广播协议是确保信息在网络中的节点之间有效传递的关键机制。一致性广播、可靠广播、原子广播和安全因果原子广播是分布式系统中用于确保消息传递和一致性的四种不同类型的广播协议。它们各自有不同的目标和特性&#xff0c;适用于不同的应用场景。本…

自定义微信红包封面小程序,附带后端源码,快速制作个性化红包封面

此小程序适合流量主引流&#xff0c;赚广告费&#xff0c;适合广流量主&#xff0c;适合流量主。 采用云开发&#xff0c;无需服务器&#xff0c;无需域名。小程序里插入banner广告&#xff0c;插屏广告&#xff0c;视频广告&#xff0c;激励式广告。邀请好友获取抽奖机会&…

医院陪诊管理系统(源码+文档)

TOC) 文件包含内容 1、搭建视频 2、流程图 3、开题报告 4、数据库 5、参考文献 6、服务器接口文件 7、接口文档 8、任务书 9、功能图 10、环境搭建软件 11、十六周指导记录 12、答辩ppt模板 13、技术详解 14、前端后台管理&#xff08;管理端程序&#xff09; 15、项目截图 1…

2024中国(杭州)国际数字物流技术与应用展览会将于7月8日举办

2024中国&#xff08;杭州&#xff09;国际数字物流技术与应用展览会 2024年7月8-10日 | 杭州国际博览中心 同期举办&#xff1a;2024长三角快递物流供应链与技术装备展览会 数字贸易创新引领合作动能 《十四五规划》明确指出关于“加快数字化发展&#xff0c;建设数字中国…

小程序能否替代APP?专业解析在此!

在科技行业&#xff0c;每一次创新都可能引起行业的颠覆性变革。近年来&#xff0c;随着小程序技术的迅猛发展&#xff0c;业界对于它是否将替代传统APP的讨论愈演愈烈。作为一位资深科技行业分析师&#xff0c;我将从多个维度探讨小程序与APP之间的差异&#xff0c;以及它们在…

[leetcode] 哈希表

文章目录 1.有效字母的异位词 E2. 两个数组的交集 E3.快乐数 E 1.有效字母的异位词 E :::details 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异…

Pytorch简明教程01

文章目录 01 Pytorch基础知识1.1 Tensor简介1.2 Tensor的创建1.3 张量的操作1. 运算操作2. 矩阵运算3. 维度变换4. 扩展和压缩维度 1.4 广播机制1.5 梯度计算 01 Pytorch基础知识 主要介绍pytorch中的tensor&#xff0c;包括tensor的创建、基本操作、广播机制等 1.1 Tensor简介…

Windows安装Mysql8

新建Mysql配置文件 my.ini [mysql] # 设置mysql客户端默认字符集 default-character-setutf8 [mysqld] #设置3306端口 port 3306 # 设置mysql的安装目录 basedirD:\\KaiNeng\\mysql-8.0.26-winx64 # 设置mysql数据库的数据的存放目录 datadirD:\\KaiNeng\\m…

爬虫工作量由小到大的思维转变---<第六十四章 > Scrapy利用Bloom过滤器增强爬虫的页面去重效率

前言&#xff1a; 网络爬虫系统是信息时代获取和管理网络数据的重要工具&#xff0c;广泛应用于搜索引擎索引、数据聚合、在线研究等领域。随着网络信息的海量增长&#xff0c;爬虫系统不可避免地会面临重复内容的爬取问题。这不仅浪费了计算资源和网络带宽&#xff0c;而且还会…