vue源码分析:响应式之依赖收集

今天记录下vue源码的响应式的源码学习,第一步,我们想下,为什么为们写一个data。然后里边的数据变化就能映射到dom的变化上。这里用到了Object.defineProperty(obj,key, {}),如果你还不了解建议去jsmdn上仔细了解下,这个函数的目的就是检测你得赋值和取值的过程用来定义自己的行为,比如obj[key]会拿到配置里边的get函数定义,obj[key] = ‘xxx‘会调用配置中的set。那么vue也是一样的,在get中做了依赖收集(也就是说哪些dom用到了我定义的这个key,然后记录下来,等执行set时候对记录下来的dom进行更新)。那我们了解了基本流程之后现在来看下vue的源码具体分析吧。对data的分析是来自_init  -> initState ->  initData

这里我们拿到我们穿进去的data,这里的这个data如果是一个函数的话那就调用取出来最后得到的是一个对象,箭头指的proxy函数的目的是把data中的各个key代理到vm实例上。这个时候我们就在单文件组件中用this[key]来取到对应的值。大家感兴趣的可以自己去看,如果有疑问的可以留言,大家一起讨论下。
重点来了。箭头指的observe函数,我们看下这个函数做了什么。

我们先把各个判断的逻辑省略掉,先看主体流程,我们这个时候new Observer(data)。这个Observe做了什么呐?

这里,我们首先new Dep()这个用来干什么呐?个人认为他是一个观察者模式,在这里我们会存储我们的依赖,即哪些dom模块订阅了我们的data,然后我们通过def这个函数把data.__ob__这个属性的值为当前的Ovserver实例。然后我们来执行walk(),默认为对象了,数组会在之后进行新的随笔来介绍。

walk的逻辑很简单,就是循环遍历我们的data。然后调用defineReactive方法。defineReactive中我们开始用我们上边讲到的Object.definePropery。

Dep.target:这个东西我们先理解为一个函数,这个函数的作用呐,就是更新dom的函数。还记得之前对于dep的定义吗?那么我们下面看看dep.depend()。这个方法。

这里又调用了Dep.target.addDep这个方法。

大家可以看到这个时候呐。我们把Dep.target保存到我们的dep中了。以后当我们数据发生变化,我们只要在dep的subs中依次调用就好了。这个文章可能不是很详细的介绍,值提供了一定的思路,大家自己研究扩展,如果有意可以一起交流学习。

备注:读慕课网黄亦老师的开源电子书进行整理的。

原文地址:https://www.cnblogs.com/hjdjs/p/9723048.html

时间: 2024-10-10 04:58:24

vue源码分析:响应式之依赖收集的相关文章

vue源码之响应式数据

分析vue是如何实现数据响应的. 前记 现在回顾一下看数据响应的原因. 之前看了vuex和vue-i18n的源码, 他们都有自己内部的vm, 也就是vue实例. 使用的都是vue的响应式数据特性及$watchapi. 所以决定看一下vue的源码, 了解vue是如何实现响应式数据. 本文叙事方式为树藤摸瓜, 顺着看源码的逻辑走一遍, 查看的vue的版本为2.5.2. 目的 明确调查方向才能直至目标, 先说一下目标行为: vue中的数据改变, 视图层面就能获得到通知并进行渲染. $watchapi监

Vue源码之响应式原理(个人向)

浅谈响应式原理 关于响应式原理,其实对于vue这样一个大项目来说肯定有很多细节和优化的地方,在下水平精力有限,不能一一尝试探索,本文仅以将响应式的大致流程个人向的梳理完毕为目的. 对于响应式主要分为三大部分来分析,1.响应式对象:2.依赖收集:3.派发更新. 最后将是个人的分析. 1.响应式对象 (Object.defineProperty) 我们先从初始化数据开始,再介绍几个比较核心的方法. 1.1.initState 文件位置:src/core/instance/state.js 在Vue的

[Vue源码分析] v-model实现原理

最近小组有个关于vue源码分析的分享会,提前准备一下- 前言:我们都知道使用v-model可以实现数据的双向绑定,及实现数据的变化驱动dom的更新,dom的更新影响数据的变化.那么v-model是怎么实现这一原理的呢?接下来探索一下这部分的源码. 前期准备①:vue2.5.2源码(用于阅读.查看关联等)②:建立vue demo,创建包含v-model指令的实例(用于debugger)以下为demo: genDirectives在模板的编译阶段, v-model跟其他指令一样,会被解析到 el.d

Ace 1.3.1 网站管理后台源码 Bootstrap响应式模板主题

Ace 响应式管理后台模板最新版本v1.3.1同步升级,欢迎下载使用,注意:本站提供为官网购买压缩源码版,在官网上用18$买来,现只售20元,可以帮亲省3/4的额外开销哦,需要的亲可以到本博的淘宝小店购买,包升级(免费!). Ace简介: Ace (v1.3.1)是一个轻量.功能丰富.HTML5.响应式.支持手机及平板电脑上浏览的管理后台模板,基于CSS框架Bootstrap制作,Bootstrap版本更新至 3.0,Ace – Responsive Admin Template当前最新版! 淘

Matrix Admin html5网站管理后台源码 Bootstrap响应式模板主题

Matrix Admin 响应式管理后台模板最新版本,欢迎下载使用,注意:本站提供为官网购买未压缩源码版,在官网上用10$买来,现只售15元,可以帮亲省额外开销哦,需要的亲可以到本博的淘宝小店购买. Matrix Admin 简介: Matrix Admin 是一个轻量.功能丰富.HTML5.响应式.支持手机及平板电脑上浏览的管理后台模板,基于CSS框架Bootstrap制作,Bootstrap版本更新至 3.0,Matrix Admin 当前最新版! 淘宝购买地址(新地址,更新至最新的1.3.

Vue源码分析(二) : Vue实例挂载

author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-with-compiler.js & src/platforms/web/runtime/index.js 等文件中都有对Vue.prototype.$mount的定义: // vue/platforms/web/entry-runtime-with-compiler.js Vue.prototype.$mount = function ( e

knockout源码分析之computed(依赖属性)

一.序列图 二.主要代码文件 1.dependentObservable.js:主要包含ko.computed相关方法的处理2.dependencyDetection.js:主要包含依赖的监控上下文对象. 三.主要逻辑 1.首先为某个属性定义 一个computed对象,如下源码: var vModel = function(){ this.fName = ko.observable('fName'), this.lName= ko.observable('lName'), this.name=

vue 源码分析之如何实现 observer 和 watcher

https://segmentfault.com/a/1190000004384515 本文能帮你做什么? ..好奇vue双向绑定的同学, 可以部分缓解好奇心 还可以帮你了解如何实现$watch 前情回顾 我之前写了一篇没什么干货的文章..并且刨了一个大坑.. 今天..打算来填一天..并再刨一个..哈哈 不过话说说回来了.看本文之前,, 如果不知道Object.defineProperty,还必须看看解析神奇的 Object.defineProperty 不得不感慨vue的作者,人长得帅,码写的

java 企业站源码 自适应响应式 兼容手机平板PC SSM freemaker 静态引擎主流框架

前台: 支持四套模版, 可以在后台切换 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便,对服务器负担小 3.网站前端采用主流的响应式布局,同一页面同时支持PC.平板.手机(三合一)浏览器访问 4.springmvc +spring4.3.7+ mybaits3.3  SSM 普通java web(非maven, 赠送pom.xml)  数据库:mysql --------