这篇主要讲的就是vue很重要的一块知识点,双向数据绑定是如何实现的。一开始看这一块的内容的时候比较迷茫,迷茫在以下几个点:
- 这块内容该从哪边入手
- 数据变化是如何驱动视图层更新的
- 做题深化知识点
从哪边着手去看响应式原理
我这边提供三个方向,从这三个方向,你都可以看到watcher的使用,然后watcher的使用过程中,会掺杂到observer以及dep,然后以点带面,对整体进行梳理
初始化的render流程去看
在lifecycle这个文件中的mountComponent这个方法里,创建了一个watcher。代码如下:
new Watcher(vm, updateComponent, noop, { before () { if (vm._isMounted && !vm._isDestroyed) { callHook(vm, 'beforeUpdate') } } }, true /* isRenderWatcher */)
可以透过这个传参,梳理出整一个
- 从watch的角度去看
- 从computed的角度去看
数据变化是如何驱动视图层更新的
这个问题其实可以分两个方面去看:
如何知道数据变化了
如何知道某一块视图和数据有关,并更新他 如何知道数据变化了
答案:数据劫持
数据劫持的两种方式
Object.defineProperty proxy
Vue3.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部分。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。