时间:2021-05-25
前言
如果自己去实现数据驱动的模式,如何解决一下几个问题:
数据劫持——obvserver
我们需要知道数据的获取和改变,数据劫持是最基础的手段。在Obeserver中,我们可以看到代码如下:
通过Object.defineProperty这个方法,我们可以在数据发生改变或者获取的时候,插入一些自定义操作。同理,vue也是在这个方法中做依赖收集和派发更新的。
绑定和更新视图——watcher
从初始化开始,我们渲染视图的时候,便会生成一个watcher,他是监视视图中参数变化以及更新视图的。代码如下:
当然,我们可以保留疑问:
具体的绑定和更新的流程,我们到后续的依赖收集中讲解。
我们先来讲讲响应式系统中涉及到的设计模式。
发布订阅模式
在发布订阅模式中,发布者和订阅者之间多了一个发布通道;一方面从发布者接收事件,另一方面向订阅者发布事件;订阅者需要从事件通道订阅事件
以此避免发布者和订阅者之间产生依赖关系
vue的响应式流程
vue的响应式系统借鉴了数据劫持和发布订阅模式。
Vue用Dep作为一个中间者,解藕了Observer和Watcher之间的关系,使得两者的职能更加明确。
那具体是如何来完成依赖收集和订阅更新的呢?
依赖收集过程
依赖收集的流程
举个例子
依赖收集流程图:
如何看懂这个依赖收集流程?关键在watcher代码中:
调用的这个this.getter有两种,一种是key值的getter方法,还有一种是expOrFn,比如mounted中传入的updateComponent。
如何防止重复收集
我们不妨想想什么才算是重复收集了?
笔者想到一种情况:就是dep数组中,出现了多个一样的watcher。
比如renderWatch就容易被重复收集,因为我们在html模版中,会重复使用data中的某个变量。那他是如何去重的呢?
1、只有watch在执行get时,触发的取数操作,才会被收集
当只有Dep.target这个存在的时候才进行依赖收集。Dep.target这个值只有在watcher执行get方法的时候才会存在。
2、在dep.depend的时候会判断watch的id
我们会发现,在depend过程中,会有一个newDepIds去记录已经存入的dep的id,当一个watcher已经被该dep存过时,便不再会进行依赖收集操作。
派发更新过程
收集流程讲完了,不妨在听听更新流程。
订阅更新的流程
老例子
<div id="app">{{ message }}{{ message1 }}<input type="text" v-model="message"><div @click="changeMessage">改变message</div> </div>var app = new Vue({el: '#app',data: {message: '1',message1: '2',},methods: {changeMessage() {this.message = '3'}},watch: {message: function(val) {this.message1 = val}}})依赖收集的最终结果:
当触发click事件的时候,便会触发订阅更新流程。
订阅更新流程图:
当renderWatch执行更新的时候,回去调用beforeUpdate生命钩子,然后执行patch方法,进行视图的变更。
如何防止重复更新
如何去防止重复更新呢?renderWatch会被很多dep进行收集,如果视图多次渲染,会造成性能问题。
其实问题的关在在于——queueWatcher
在queueWatcher中有两个操作:去重和异步更新。
其实queueWatcher很简单,将所有watch收集到一个数组当中,然后去重。
这样至少可以避免renderWatch频繁更新。
比如上述例子中的,message和message1都有一个renderWatch,但是只会执行一次。
异步更新也可以保证当一个事件结束之后,才会触发视图层的更新,也能防止renderWatch重复更新
结尾
文章讲述了响应式流程的原因,代码细节并未深入,
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
这篇文章主要是给不了解或者没接触过vue响应式源码的小伙伴们看的,其主要目的在于能对vue的响应式原理有个基本的认识和了解,如果在面试中被问到此类问题,能够知道
响应式网站对企业有什么优势?企业对于网络营销的深入了解,无论是大型企业,还是小型企业,都纷纷建立起自己的个性化响应式网站,由于好多企业对于响应式网站认识不清,在
响应式网站对企业有什么优势?企业对于网络营销的深入了解,无论是大型企业,还是小型企业,都纷纷建立起自己的个性化响应式网站,由于好多企业对于响应式网站认识不清,在
vue官网关于此解释说明如下:vue2.0里面的深入响应式原理的异步更新队列官网说明如下:只要观察到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的
深入响应式原理大部分的基础内容我们已经讲到了,现在讲点底层内容。Vue.js最显著的一个功能是响应系统——模型只是普通对象,修改它则更新视图。这让状态管理非常简