最近看实现一个vue,然后看到了vue的源码部分,这个Dep属实给我整懵了,如果数据绑定、模板解析的难度算1颗星,这个Dep掺和进去以后就是100颗星。

怎么说呢,按顺序理一遍,首先,创建Vue实例,observer订阅vm.$data,递归的订阅data中的每一个变量,用defineProperity,然后就到了这个get了。

关键是看什么时候把watcher添加到dep.subs[]里的,有的文章说是在订阅时触发get的时候创建的watcher,简直就是胡扯。

大概顺序是这么个回事,编译html模板时,发现需要特殊处理的变量,比如v-model=“name”,这个name被发现以后,就准备为其创建watcher,在创建watcher的时候,先把这个watcher挂载到Dep.target这个全局静态变量上,然后触发一次get事件,这样就触发了get函数中的Dep.target && dep.addSub(Dep.target);,等get到了变量以后,也已经添加到subs队列里了,这时候在令Dep.target = null。

这一来一回真的就把人整晕了。

而且,在变量改变,触发set函数时,要调用watcher.update()函数,这里也要触发一次get函数。因此可能会重复往subs队列添加watcher,因此还要设置一个可以自增的depid来进行唯一性控制。这也太抽象了,我人晕了。

更详细的解释我又写了一篇文章:【困难版】如何实现一个类vue的双向绑定——Vue2.0 | MVVM | 数据劫持+发布订阅

如何理解vue中的Dep类,太绕了相关推荐

  1. 深入理解vue中的slot与slot-scope (简单易懂)

    走在前端的大道上 插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示.以及怎样显示由父组件来决定. 实际上,一个slot最核心的两个问题在这里就点出来了,是显示不显示和怎样显示. 由于 ...

  2. 理解vue中less的scoped和/deep/工作原理

    理解vue中less的scoped和/deep/工作原理 scoped /deep/ 实战 总结 scoped vue项目一般是单页面.多组件,整个项目共用一个css样式表,有时候我们在写组件的过程中 ...

  3. [Vue][面试]你怎么理解vue中的diff算法?

    你怎么理解vue中的diff算法? #####源码分析1:必要性,lifecycle.js–mountComponent() vue中一个组件一个watcher实例,而组件中可能存在很多个data中的 ...

  4. 前端面试 vue生命周期钩子是如何实现的?理解vue中模板编译原理?

    生命周期钩子在内部会被vue维护成一个数组(vue 内部有一个方法mergeOption)和全局的生命周期合并最终转换成数组,当执行到具体流程时会执行钩子(发布订阅模式),callHook来实现调用. ...

  5. 如何理解vue中 同步异步

    如何理解vue中 同步异步 同步异步 , 举个例子来说,一家餐厅吧来了5个客人,同步的意思就是说,来第一个点菜,点了个鱼,好, 厨师去捉鱼杀鱼,过了半小时鱼好了给第一位客人,开始下位一位客人,就这样一 ...

  6. 理解vue中的slot-scope=“scope“

    理解vue中的slot-scope="scope" slot是插槽,slot-scope="scope"相当于一行的数据 <el-table-column ...

  7. 深刻理解Vue中的组件

    今天看了下Vue官网上关于组件的教程,感觉内容还挺多,现在把组件中基本的知识梳理一下. 组件的基本使用 注册组件 注册组件就是利用Vue.component()方法,先传入一个自定义组件的名字,然后传 ...

  8. 深入理解vue中的slot与slot-scope

    写在前面 vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项在使用频率.使用先后上的差别,这就有可能造成初次接触插槽的开发者容易产生&qu ...

  9. slot属性值_深入理解vue中的slot与slot

    作者/云荒杯倾 写在前面 vue中关于插槽的文档说明很短,语言又写的很凝练,再加上其和methods,data,computed等常用选项使用频率.使用先后上的差别,这就有可能造成初次接触插槽的开发者 ...

最新文章

  1. 智慧农场基本情况交流会议记录
  2. 【NLP-词向量】词向量的由来及本质
  3. HDUOJ-----Brave Game
  4. GCC built in CAS API
  5. SpringSecurity分布式整合之分布式认证流程说明
  6. android 通知灯 测试,Android灯光系统通知灯【转】
  7. MyBatis-Plus_简介
  8. [1424] 金克拉与贪吃蛇的故事
  9. 精明管理者选人的N种方式
  10. 包含农历、节气、节假日的前端日历
  11. 快手视频大量下载无水印软件 怎样从快手下载无水印软件 说说如何在快手批量下载高清不含水印...
  12. c/c++实现二叉树的创建以及前中后序遍历
  13. POJ-1436Horizontally Visible Segments
  14. ERROR: Failed building wheel for pillow and ERROR: running bdist_wheel问题解决
  15. Java入门基础知识点一
  16. 苹果基带坏了怎么办_iPhone12 上市,苹果这次有哪些改变
  17. 如何设计一个混沌工程实验?
  18. 你的域名前要加www吗?
  19. [SSD核心技术:FTL 16] 固态硬盘预读技术详解
  20. Kafka创建topic

热门文章

  1. 怎样给证件照快速改底色?告诉大家一个简单方法
  2. 八年级上学期计算机教学计划,第一学期七八年级信息技术教学计划
  3. 关于PEAP认证的过程说明
  4. 慎用cv::fitLine
  5. get与post的解释与区别
  6. 在setTimeout或者ajax等异步方法中回调函数的写法与调用
  7. 绿布抠像怎么抠干净_AE如何抠取绿幕视频 干净抠像教程
  8. 用TTreeview实现的一个通讯录的组别设置,
  9. 查看windows系统和office是否永久激活(转载)
  10. Java集合判空/非空