Vue3.x核心是Proxy。两者从代码层面相比,Proxy要更加简洁,原因是Proxy是直接监听对象,而defineProperty是监听每个对象里的属性。Proxy是ES6新增的,IE浏览器不支持
<!-- Vue3.x 数据响应式原理 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>数据响应式</title>
</head>
<body>
<div id="app">
Hello Vue
</div>
<!--Vue 3.x 数据响应式原理 Proxy 代理-->
<script>
// 模拟Vue实例 data 数据
let data = {
msg: '响应式数据',
count: 0
}
// 模拟Vue实例
let vm = new Proxy(data, {
//执行代理行为的函数
//当访问vm的成员会执行
//target其实就是我们的代理对象data
get(target,key){
console.log('getter:',key ,'-----',target[key])
return target[key]
},
set(target,key,newValue) {
console.log('setter:',key ,'-----',target[key])
if(target[key] === newValue){
return;
}
target[key] = newValue
document.querySelector('#app').textContent = target[key]
}
})
vm.msg = 'Hello响应式'
console.log(vm.msg);
</script>
</body>
</html>
Proxy实现数据响应式原理要比defineProperty简便,而且Proxy是直接面向整个对象的属性,而defineProperty对一个对象的多个属性都实现数据响应式,则要循环使用Object.defineProperty