深入学习Vue响应式原理

 浆糊之家   2018-05-03 00:11   326 views 热度值

当面试官问你Vue响应式原理,你可以这么回答他

深入学习Vue响应式原理 vue 第1张

看过vue官方文档的同学,对这张图应该已然相当熟悉了。

vue的响应式是如何实现的?

听过太多回答,通过Object.defineProperty,可是再详细的问时,对方浑然不知。

先撸为敬

 

这里我们用不到100行的代码,实现了一个简易的vue响应式。当然,这里如果不考虑期间的过程,我相信,40行代码之内可以搞定。但是我这里不想省略,为什么呢?我怕你把其中的过程自动忽略掉,怕别人问你相关东西的时候,明明自己看过了,却被怼的哑口无言。总之,我是为了你好,多喝热水。

Dep的作用是什么?

依赖收集器,这不是官方的名字蛤,我自己起的,为了好记。

用两个例子来看看依赖收集器的作用吧。

  • 例子1,毫无意义的渲染是不是没必要?

 

vm.text2的值发生变化时,会再次调用render,而template中却没有使用text2,所以这里处理render是不是毫无意义?

针对这个例子还记得我们上面模拟实现的没,在Vuerender函数中,我们调用了本次渲染相关的值,所以,与渲染无关的值,并不会触发get,也就不会在依赖收集器中添加到监听(addSub方法不会触发),即使调用set赋值,notify中的subs也是空的。OK,继续回归demo,来一小波测试去印证下我说的吧。

例子2,多个Vue实例引用同一个data时,通知谁?是不是应该俩都通知?

希望通过这两个例子,你已经大概清楚了Dep的作用,有没有原来就那么回事的感觉?有就对了。总结一下吧(以下依赖收集器实为Dep):

  • vuedata初始化为一个Observer并对对象中的每个值,重写了其中的getsetdata中的每个key,都有一个独立的依赖收集器。
  • get中,向依赖收集器添加了监听
  • 在mount时,实例了一个Watcher,将收集器的目标指向了当前Watcher
  • data值发生变更时,触发set,触发了依赖收集器中的所有监听的更新,来触发Watcher.update

如果被 Watcher 和 Dep搞晕了, 所以sealzrt同学画了张草图, 梳理一下执行顺序, 做个记录.

  1. 不规则椭圆 是对象, new Vue(), Dep1, Dep2, new Warcher
  2. 长方体是函数, render(), Dep(),
  3. 双线箭头是调用 =>
  4. 单线箭头是依赖关系 ->

深入学习Vue响应式原理 vue 第2张

 发表评论


表情