目录
一、前景提要
在No.1 初步认识Vue2.0中已经完成了一下几点:
- Vue2.0的下载安装以及引入
- Vue中的{{ }}绑定
- 表单的绑定事件:双向/单向绑定
- el与data的几种书写方式
二、MVVM模型简述
M:模型model,对应data中的数据,对应Vue中的数据,(Plain JavaScript Object)
V:视图view,模板(dom)
VM:视图模型viewModel:Vue对象
三、回顾defineproperty方法
3.1 不可枚举、不可删除、不可修改属性的介绍及更改
<script>
let person = {
name : "张三",
sex : "男",
}
// 通过defineProperty方法向person中添加age属性
Object.defineProperty(person,'age',{
value:18
})
// 遍历出可以枚举的属性
// 方法一
console.log(Object.keys(person))
// 方法二
for(let key in person){
console.log(person[key])
}
// 输出person的内容
console.log(person)
</script>
输出结果
想要可以枚举的办法:添加属性
// 通过defineProperty方法向person中添加age属性
Object.defineProperty(person,'age',{
value:18,
enumerable:true, // 控制属性是否可以枚举,默认是false
writable:true, // 控制属性是否可以被修改,默认是false
configurable:true, //控制属性是否可以被删除,默认是false
})
// 遍历出可以枚举的属性
3.2 setter函数的使用
<script>
let number = 18;
let person = {
name : "张三",
sex : "男",
}
// 通过defineProperty方法向person中添加age属性
Object.defineProperty(person,'age',{
// 当有人读取person的age属性时,get函数就会被调用,且返回值就是age的值
get:function(){
// console.log("有人调用person中的key")
return number
}
})
// 遍历出可以枚举的属性
// 方法一
console.log(Object.keys(person))
// 方法二
for(let key in person){
console.log(person[key])
}
// 输出person的内容
console.log(person)
</script>
此时修改number的值时,将会同步修改person中的age的属性值,且修改person中的age时将不会生效
简写:
<script>
let number = 18;
let person = {
name : "张三",
sex : "男",
}
// 通过defineProperty方法向person中添加age属性
Object.defineProperty(person,'age',{
// 当有人读取person的age属性时,get函数就会被调用,且返回值就是age的值
get(){
console.log("有人调用person中的key")
return number
}
})
</script>
3.3 getter函数的使用
<script>
let number = 18;
let person = {
name : "张三",
sex : "男",
}
// 通过defineProperty方法向person中添加age属性
Object.defineProperty(person,'age',{
// 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就
get(){
console.log("有人调用person中的key")
return number
},
// 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修
set(value){
console.log("有人修改了age属性,值为",value)
}
})
// 遍历出可以枚举的属性
// 方法一
console.log(Object.keys(person))
// 方法二
for(let key in person){
console.log(person[key])
}
// 输出person的内容
console.log(person)
</script>
如果想要改变,可以让number进行改变
<script>
let number = 18;
let person = {
name : "张三",
sex : "男",
}
// 通过defineProperty方法向person中添加age属性
Object.defineProperty(person,'age',{
// 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
get(){
console.log("有人调用person中的key")
return number
},
// 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的值
set(value){
console.log("有人修改了age属性,值为",value)
number = value
}
})
</script>
四、数据代理
4.1 何为数据代理
通过一个对象代理对另一个对象中属性的操作(读/写)
<script>
let obj = {
x:100
}
let obj2 = {y:200}
// 通过defineProperty方法向person中添加age属性
Object.defineProperty(obj2,'x',{
// 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
get(){
console.log("有人调用obj中的x")
return obj.x
},
// 当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的值
set(value){
console.log("有人修改了obj2中的x属性,值为",value)
obj.x = value
}
})
// 遍历出可以枚举的属性
// 方法一
console.log(Object.keys(obj2))
// 方法二
for(let key in obj2){
console.log(obj2[key])
}
// 输出person的内容
console.log(obj2)
</script>
4.2 Vue中的数据代理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue中的数据代理</title>
<script type="text/javascript" src="js/vue.js"></script>
</head>
<body>
<!-- 创建一个容器 -->
<div id="root">
<h2>学校名称:{{name}}</h2>
<h2>学校地址:{{address}}</h2>
</div>
<script>
// 阻止vue产生生产提示
Vue.config.productionTip = false;
const vm = new Vue({
el:'#root',
data:{
name : "爱我中华!",
address : "中国"
}
})
</script>
</body>
</html>
有人访问这些值的时候getter工作,修改时setter开始工作,值将从data中拿取,与本文4.1中的代理一样
data中的数据一旦发生改变,页面将实时更新
4.3 总结
Vue中的数据代理:通过vm对象来代理data对象中的属性的操作(读/写)
Vue中数据代理的好处:更加方便的操作data中的数据
基本原理:
- 通过Object.defineProperty()把data对象中所有属性添加到vm上
- 为每一个添加到vm上的属性,都指定一个getter/setter
- 在getter/setter内部去操作(读/写)data中对应的属性