时间:2021-05-26
这篇主要讲的就是vue很重要的一块知识点,双向数据绑定是如何实现的。一开始看这一块的内容的时候比较迷茫,迷茫在以下几个点:
从哪边着手去看响应式原理
我这边提供三个方向,从这三个方向,你都可以看到watcher的使用,然后watcher的使用过程中,会掺杂到observer以及dep,然后以点带面,对整体进行梳理
初始化的render流程去看
在lifecycle这个文件中的mountComponent这个方法里,创建了一个watcher。代码如下:
new Watcher(vm, updateComponent, noop, { before () { if (vm._isMounted && !vm._isDestroyed) { callHook(vm, 'beforeUpdate') } }}, true )可以透过这个传参,梳理出整一个
数据变化是如何驱动视图层更新的
这个问题其实可以分两个方面去看:
如何知道数据变化了
如何知道某一块视图和数据有关,并更新他 如何知道数据变化了
答案:数据劫持
数据劫持的两种方式
Object.definePropertyproxyVue3.0中的数据劫持是用proxy来实现的,目前阅读的源码中,都是以 Object.defineProperty 这种方式来实现的。
如何知道某一块视图和数据有关,并更新他
答案:依赖收集以及订阅更新
详细解读过程:用图告诉你响应式原理
这里仅用一个简单的例子和图,来明确一下整个流程
<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 = '2' } }, watch: { message: function(val) { this.message1 = val } }})依赖收集流程图
依赖收集的最终结果:
订阅更新流程图:
。
做题深化知识点
题目如下:
1、简述Vue的响应式原理
2、计算属性和watch的区别
3、Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决?
对于第一和第二在这里就不花篇幅去说明。
Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决?
我们在做业务的时候经常会遇到这样的情况,我举一个简单的例子:
<template> <div> <ul> <li v-for="value in obj" :key="value"> {{value}} </li> </ul> <button @click="addObjB">添加obj.b</button> </div></template><script>export default { data () { return { obj: { a: 'obj.a' } } }, methods: { addObjB () { this.obj.b = 'obj.b' console.log(this.obj) } }}</script><style></style>依赖收集流程:
从中我们可以发现,renderWatch是有收集 Dep(obj) 和 Dep(Obj.a) 的,但是当我们改变Obj的时候,并没有触发视图的更新。因为我们在改变obj的值的时候,并没有去触发Dep(obj)。
产生问题的本质原因:
1、vue会在state.js文件的initData的方法中,将data属性中的每一个key都变成响应式属性。
2、视图在渲染过程中,会将renderWatcher收集到用到的值的dep中,方便依赖更新(不懂的在回过去看一下依赖收集流程)
3、当你额外添加一个属性的时候,该属性并不是响应式属性。
那如何去改变:
addObjB () { // this.obj.b = 'obj.b' this.$set(this.obj, 'b', 'obj.b') console.log(this.obj)}总结
这篇文章是年度总结的开篇,后续会继续总结初始化部分、render部分和patch部分。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
响应数据和结果视图返回值分类controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。//指定逻辑视图名,经过视图解析器解析为js
分析vue是如何实现数据改变更新视图的.前记三个月前看了vue源码来分析如何做到响应式数据的,文章名字叫vue源码之响应式数据,最后分析到,数据变化后会调用Wa
在Mvc模式大行其道的今天,后端通过各种Mvc框架实现视图与数据模型的隔离,而前端这方面也发展迅速。vue实现了Dom与viewModel双向绑定,使其视图的更
这篇文章主要介绍了SpringBoot和Vue跨域请求问题原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
这篇文章主要介绍了Java流程控制顺序结构原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下流程控制的概