vue实现数据控制视图的原理解析
前端  /  管理员 发布于 4年前   450
这篇主要讲的就是vue很重要的一块知识点,双向数据绑定是如何实现的。一开始看这一块的内容的时候比较迷茫,迷茫在以下几个点: 从哪边着手去看响应式原理 我这边提供三个方向,从这三个方向,你都可以看到watcher的使用,然后watcher的使用过程中,会掺杂到observer以及dep,然后以点带面,对整体进行梳理 初始化的render流程去看 在lifecycle这个文件中的mountComponent这个方法里,创建了一个watcher。代码如下: 可以透过这个传参,梳理出整一个 数据变化是如何驱动视图层更新的 这个问题其实可以分两个方面去看: 如何知道数据变化了 如何知道某一块视图和数据有关,并更新他 如何知道数据变化了 答案:数据劫持 数据劫持的两种方式 Vue3.0中的数据劫持是用proxy来实现的,目前阅读的源码中,都是以 如何知道某一块视图和数据有关,并更新他 答案:依赖收集以及订阅更新 详细解读过程:用图告诉你响应式原理 这里仅用一个简单的例子和图,来明确一下整个流程 依赖收集流程图 依赖收集的最终结果: 订阅更新流程图: 。 做题深化知识点 题目如下: 1、简述Vue的响应式原理 2、计算属性和watch的区别 3、Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 对于第一和第二在这里就不花篇幅去说明。 Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 我们在做业务的时候经常会遇到这样的情况,我举一个简单的例子: 依赖收集流程: 从中我们可以发现,renderWatch是有收集 产生问题的本质原因: 1、vue会在state.js文件的initData的方法中,将data属性中的每一个key都变成响应式属性。 2、视图在渲染过程中,会将renderWatcher收集到用到的值的dep中,方便依赖更新(不懂的在回过去看一下依赖收集流程) 3、当你额外添加一个属性的时候,该属性并不是响应式属性。 那如何去改变: 总结 这篇文章是年度总结的开篇,后续会继续总结初始化部分、render部分和patch部分。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!new Watcher(vm, updateComponent, noop, { before () { if (vm._isMounted && !vm._isDestroyed) { callHook(vm, 'beforeUpdate') } }}, true /* isRenderWatcher */)
Object.definePropertyproxy
Object.defineProperty
这种方式来实现的。var app = new Vue({ el: '#app', data: { message: '1', message1: '2', }, methods: { changeMessage() { this.message = '2' } }, watch: { message: function(val) { this.message1 = val } }})
Dep(obj)
和 Dep(Obj.a)
的,但是当我们改变Obj的时候,并没有触发视图的更新。因为我们在改变obj的值的时候,并没有去触发Dep(obj)。addObjB () { // this.obj.b = 'obj.b' this.$set(this.obj, 'b', 'obj.b') console.log(this.obj)}
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!您可能感兴趣的文章:
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号