1 vue双向数据绑定深入理解
当你把一个普通的JavaScript对象传入Vue实例作为data选项,Vue将遍历此对象的所有Property,并使用Object.defineProperty把这些Property全部转为getter/setter。Object.defineProperty是ES5中一个无法shim的特性,这也是Vue不支持IE8以及更低版本浏览器的原因。
这些getter/setter对用户来说是不可见的,但是在内部它们让Vue能够追踪依赖,在property被访问和修改时通知变更。
2双向数据绑定原理代码实现
//操作了一个属性
<body>
<div id="app"></div>
<script>
let data={
msg:'hello'
}
let vm={}
Object.defineProperty(vm,"msg",{
enumerable:true,//可枚举
configurable:true, //可配置,
get(){
console.log('get',data.msg);
},
set(newValue){
console.log('set',newValue);
if(newValue===data.msg){
return;
}
data.msg=newValue;
document.querySelector("#app").textContent=data.msg
}
})
vm.msg="你好哈哈哈";
</script>
</body>
//操作了多个属性
<body>
<div id="app"></div>
<!-- <script>
let data={
msg:'hello'
}
let vm={}
Object.defineProperty(vm,"msg",{
enumerable:true,//可枚举
configurable:true, //可配置,
get(){
console.log('get',data.msg);
},
set(newValue){
console.log('set',newValue);
if(newValue===data.msg){
return;
}
data.msg=newValue;
document.querySelector("#app").textContent=data.msg
}
})
vm.msg="你好哈哈哈";
</script> -->
<script>
//data中有多个属性
let data={
msg:'hello',
count:10
}
let vm={}
proxyData(data);
function proxyData(data){
Object.keys(data).forEach((key)=>{
Object.defineProperty(vm,key,{
enumerable:true,
configurable:true,
get(){
console.log('get',key,data[key]);
return data[key];
},
set(newValue){
console.log('set',key,newValue);
if(data[key]===newValue){
return;
}
data[key]=newValue;
document.querySelector("#app").textContent= data[key]
}
})
})
}
vm.msg="今天星期三";
console.log(vm.msg);
</script>
</body>