这篇文章将为大家详细讲解有关vue如何实现数据控制视图,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
这篇主要讲的就是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)
}
关于“vue如何实现数据控制视图”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。