这篇文章将为大家详细讲解有关vue如何实现数据控制视图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
这篇主要讲的就是vue很重要的一块知识点,双向数据绑定是如何实现的。一开始看这一块的内容的时候比较迷茫,迷茫在以下几个点:
- <李>
这块内容该从哪边入手
李> <李>数据变化是如何驱动视图层更新的
李> <李>做题深化知识点
李><强>从哪边着手去看响应式原理强>
我这边提供三个方向,从这三个方向,你都可以看到观察者的使用,然后观察者的使用过程中,会掺杂到观察者以及环保局,然后以点带面,对整体进行梳理
初始化的呈现流程去看
在生命周期这个文件中的mountComponent这个方法里,创建了一个观察者。代码如下:
new 观察者(vm, updateComponent,,等待,,{ ,before (), { if 才能;(vm._isMounted ,,, ! vm._isDestroyed), { callHook才能(vm, & # 39; beforeupdate # 39;) ,,} ,}/*},,true isRenderWatcher */)
可以透过这个传参,梳理出整一个
- <李>
从手表的角度去看
李> <李>从计算的角度去看
李><强>数据变化是如何驱动视图层更新的强>
这个问题其实可以分两个方面去看:
<强>如何知道数据变化了强>
如何知道某一块视图和数据有关,并更新他如何知道数据变化了
答案:数据劫持
数据劫持的两种方式
Object.defineProperty 代理
Vue3.0中的数据劫持是用代理来实现的,目前阅读的源码中,都是以<代码> Object.defineProperty 代码>这种方式来实现的。
<>强如何知道某一块视图和数据有关,并更新他强>
答案:依赖收集以及订阅更新
详细解读过程:用图告诉你响应式原理
这里仅用一个简单的例子和图,来明确一下整个流程
& lt; div id=癮pp"比; ,{{,message }} ,{{,message1 }} ,& lt; input 类型=皌ext", v模型=癿essage"比; ,& lt; div  @click=癱hangeMessage"在改变message
var app =, Vue ({new ,el: & # 39; #应用# 39; ,数据:{ ,,信息:& # 39;1 & # 39; ,,消息1:& # 39;2 & # 39; }, ,方法:{ changeMessage才能(),{ ,,this.message =, & # 39; 2 & # 39; ,,} }, ,看:{ ,,信息:函数(val), { ,,this.message1 =瓦尔 ,,} ,} })
依赖收集流程图
<人物> 图>
依赖收集的最终结果:
<人物> 图>
订阅更新流程图:
<人物> 图>
。
<强>做题深化知识点强>
题目如下:
1,简述vue的响应式原理
2,计算属性和观看的区别
3, vue中给数据中的对象属性添加一个新的属性时会发生什么,如何解决?
对于第一和第二在这里就不花篇幅去说明。
<强> vue中给数据中的对象属性添加一个新的属性时会发生什么,如何解决? 强>
我们在做业务的时候经常会遇到这样的情况,我举一个简单的例子:
& lt; template> ,& lt; div> ,& lt; ul> & lt;才能li v=皏alue obj",拷贝:关键=皏alue"比; ,,{{value}} & lt;才能/li> ,& lt;/ul> ,& lt; button  @click=癮ddObjB"在添加obj.b ,& lt;/div> & lt;/template> & lt; script> export default  { ,data (), { ,return { obj才能:{ 答:才能,& # 39;obj.a& # 39; ,,} ,} }, ,方法:{ ,addObjB (), { 时间=this.obj.b 才能;& # 39;obj.b& # 39; console.log才能(this.obj) ,} ,} } & lt;/script> & lt; style> & lt;/style>
依赖收集流程:
<人物> 图>
从中我们可以发现,renderWatch是有收集