返回

Vue学习笔记|Vue基础03

MVVM模型、数据代理

MVVM模型

  • M:模型(Model) :对应data中的数据
  • V: 视图(View) :模板
  • VM:视图模型(ViewModel):Vue实例对象

MVVM模型

M:

1
2
3
4
data:{
	name:'wyatt',
	address:'xaut',
}

V:

1
2
3
4
<div id="root">
	<h1>名称:{{name}}</h1>
	<h1>学校:{{address}}</h1>
</div>

VM:

Vue实例对象

观察发现:

  • M中所有的属性,最后都出现在了VM中。
  • VM中所有的属性及Vue原型上所有属性,在Vue模板中都可以直接使用。

数据代理

数据代理的实现基础

Object.defineProperty()方法允许通过属性描述对象,定义或修改一个属性,然后返回修改后的对象,它的用法如下。

1
Object.defineProperty(object, propertyName, attributesObject)

object:属性所在的对象

propertyName:字符串,表示属性

attributesObject:属性描述对象

官方文档:Object.defineProperty() - JavaScript

什么是数据代理

数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//例:使用对象obj2代理对象obj中x属性的读/x
let obj = {x:100}
let obj2 = {y:200}

Object.defineProperty(obj2,'x',{
    //当有人读取obj2的x属性时,get函数(getter)就会被调用,且返回值就是obj.x的值
	get(){
		return obj.x
	},
    //当有人修改obj2的x属性时,set函数(setter)就会被调用,且会收到修改的具体值
	set(value){
		obj.x = value
	}
})
  • 定义两个对象objobj2,通过Object.defineProperty()方法给对象obj2添加一个属性x
  • 通过get()方法使obj2.x获取到obj.x的值,实现通过obj2对象代理obj.x属性的读
  • 通过set()方法使obj2.x获取到修改的具体值,将该值赋给obj.x,实现通过obj2对象代理obj.x属性的写。

Vue中的数据代理

  • Vue中的数据代理:

    • 通过vm对象来代理 _data对象中属性的操作(读/写)

      _data是来自new Vue时的对象data

  • Vue中数据代理的好处:

    • 更加方便的操作data中的数据
  • 基本原理:

    • 通过Object.defineProperty() _data对象中所有属性添加到vm中
    • 为每一个添加到vm上的属性,都指定一个getter/setter
    • getter/setter内部去操作(读/写)_data中对应的属性。

Vue中数据代理示例图

最后更新于 Mar 04, 2022 15:01 UTC
Built with Hugo
Theme Stack designed by Jimmy