Vue2语法--MVVM模型与数据代理

159 阅读2分钟

MVVM模型

image.png

1、模型组成:
(1)M:Model模型,用于保存数据
(2)V:View视图,对应template中的DOM部分
(3)VM:ViewModel视图模型,是连接视图和模型之间的地方,比如视图或者数据发生相应地变化通过VM将相应地变化传递给另一方。
2、作用:通过修改数据、视图层自动渲染,不用我们自己操作DOM,这就是数据驱动视图。

Vue中数据代理引入

vue中数据代理

1、作用:通过数据代理使data对象中的所有属性由vm对象来代理操作。 2、举例:比如,我创建如下的vue实例vm,在控制台查看vm

const vm = new Vue({
    el:'#root',
	data:{
		name1:'bug_killer1',
		name2:'bug_killer2',
		age:19,
	}
})

image.png
可以发现data中的数据出现在了vm对象中

vue中的数据代理就是将data中的数据代理给vm,并且当数据被访问或者被修改时vm中的数据和data中的数据都发生改变,这些功能通过vm提供的getter()和setter()函数来实现,如下图:

  • vm中的getter()和setter()

image.png

Object.defineProperty方法

1、作用:给vm添加与data对象的属性对应的属性 2、案例: 通过Object.defineProperty方法创建一个person对象

<script>
		let hobyy = '学习'
		let person = {
		  name: '张三',
		  sex: '男',
		}
		
		Object.defineProperty(person, 'hobby', {
		  // value:18,
		  // enumerable:true,		是否可以枚举
		  // writable:true,			是否可以被修改
		  // configurable:true	是否可以被删除		
		  // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
		  get() {
		    console.log('有人读取hobby属性了')
		    return hobby
		  },
		
		  // 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
		  set(value) {
		    console.log('有人修改了hobby属性,且值是', value)
		    number = value
		  }
		
		})
		// console.log(Object.keys(person))
		console.log(person)
	</script>

image.png
可以发现这个人具有了set(),get()方法,和vue中的数据代理一样。

image.png

我们在控制台对hobby属性进行了修改和访问发现set(),get()函数被调用了。这里报错不用管,因为person本身就没有定义hobby属性,直接访问会出错,这里只是演示defineProperty。

Vue中数据代理

1、Vue数据代理原因:更方便的操作data中的数据。 2、Vue数据代理原理:

image.png (1)用object.defineProperty()方法将data中的属性代理到vm上;
(2)给每一个vm中的属性都添加getter,setter属性;
(3)在getter setter内部去操作data中对应的属性;

补充:
(1)Vue设计_data是为了实现响应式。响应式就是当vm中数据发生变化时,能将使页面中的数据自动更新。在_data中的调整,使当数据发生变化时,Vue可以检测到数据改变了从而实现数据自动更新;
(2)_datadata进行数据劫持,实现响应式;

image.png

参考文章1
参考文章2