vue2.0响应式原理,vue.js响应式原理_1

  vue2.0响应式原理,vue.js响应式原理

  本文主要介绍了vue组件通信的几种方法,具有一定的参考价值。感兴趣的朋友可以参考一下,希望能帮到你。

  

目录

   1、响应式原理基础2、核心对象:Dep和Watcher3、集合依赖和更新依赖3.1集合依赖3.2更新依赖4、源代码调试4.1测试1的页面代码、对象描述2、Dep和Watcher的关系3、最终关系结果4.2源代码调试1、集合依赖的入口函数:initState(页面初始化时执行);2.初始化计算和观察器时,生成观察器实例化对象的摘要。

  

1、响应式原理基础

  响应的基本原理是基于对象。定义属性(对象、属性、描述符)。在描述符中,可以定义get和set方法,获取属性值时可以触发get方法(可以收集依赖关系),设置属性值时可以触发set方法(依赖关系更新)。

  扩展:以上是vue2.0的响应式基本原理,vue3.0的基本原理是Proxy,可以监控属性的get和set方法,属性的添加和删除等。它比Object.defineProperty更强大,但与IE11不兼容。

  

2、核心对象:Dep与Watcher

  Dep:Vue在数据中声明的每一个属性都会生成一个dep的实例对象,Dep.subs存储该属性发生变化时需要更新的Watcher

  Watcher:生成Watcher的实例对象有三种情况,即:

  1.计算中定义的计算属性;

  2.手表中编写的监控功能;

  3.渲染观察者;的组件;

  

3、收集依赖与更新依赖

  

3.1 收集依赖

  将Watcher的实例对象W分配给它所依赖的属性的Dep。流程如下:

  1.set dep . target=Watcer的当前实例对象w;

  2.w执行定义的函数(即computed/watch中编写的函数);

  3.如果在执行函数的过程中使用了数据中定义的属性,将会触发该属性的get方法。在get方法中,dep实例对象Dep会将Dep.target中存储的W放入dep.subs数组中,并完成依赖集合。

  解释:Dep.target是当前Watcer的实例对象。

  

3.2 更新依赖

  当我们修改一个我们声明的属性时,会触发该属性的set方法,set方法会更新dep.subs数组中收集的watcher实例对象,也就是触发我们在computed和Watch中定义的函数。

  

4、源码调试

  

4.1 测试的页面代码

  模板

  差异

  diva:输入v-model=a //div

  divc:{{ c }}/div

  divb:输入垂直模型=b //div

  /div

  /模板

  脚本

  导出默认值{

  数据:()={

  返回{

  答: ,

  b:“”

  }

  },

  计算值:{

  c() {

  返回“来源于”this.a

  }

  },

  观察:{

  b() {

  console . log(“b已更改”);

  }

  }

  };

  /脚本

  上面的代码vue在初始化后会生成以下对象:

  

1、对象说明

  属性A和B对应的Dep实例对象(由于A和B的变化需要更新的收集观察器):depa和depB

  页面渲染函数生成相应的Watcher实例对象updateWatcher;

  Computed property C生成对应的Watcher实例对象:watcherC

  monitor属性b生成对应的watch实例对象:Watcherb

  

2、Dep与Watcher的关系

  a和b改变的页面需要重新渲染,所以updateWatcher存在于depA和depB的subs中;

  计算属性C根据属性A的变化而更新,所以watcherC存在于depA的subs中;

  B的变化会触发watch中定义B的监控函数,所以watcherB存在于depB的subs中;

  

3、最终的关系结果

  final属性A=[updatewatcher,watcherc]收集的依赖depa.subs

  final属性b=[updatewatcher,watcherb]收集的依赖depb.subs

  

4.2 源码调试

  找到源文件:node _ modules \ vue \ dist \ vue . runtime . ESM . js;

  主要涉及以下功能:

  

1、收集依赖的入口函数:initState(页面初始化时执行);

  初始化顺序是data data - computed - watch first:原因是computed依赖于data,watch依赖于data和watch,依赖的需要先初始化。

  

2、初始化computed和watch时,生成Watcher实例化对象

  首先执行Watcher.get函数,实例化Dep.target=current Watcher对象。

  触发集合依赖项

  执行计算属性中的函数。如果访问数据中的某个属性,会触发数据属性的get方法,触发依赖关系收集:

  修改该属性时,将触发set方法,并将更新dep.subs中的watcher对象。

  最后,触发观察器的更新函数,将需要更新的观察器放入队列中:

  

总结

  本文到此为止。希望能帮到你,也希望你能多关注我们的更多内容!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: