1.VUE3.0的响应式通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等…通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作let obj = {name: 张三,ag...
1.VUE3.0的响应式
- 通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等…
- 通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作
let obj = {
name: '张三',
age: 26,
wife: {
name: '李四',
age: 25
}
};
/*
* 把目标对象变成代理对象
* 参数:
* 参数一:obj=>需要代理的目标对象
* 参数二:handler=>处理器对象,用来监视数据及数据的操作
*/
let proxyObj = new Proxy(obj, {
/*
* 修改目标对象的属性值为目标对象添加的新属性
* 参数:
* 参数一:obj=>需要代理的目标对象
* 参数二:prop=>需要设置值的key
* 参数三:value=>需要设置的值的value
*/
set(obj, prop, value) {//
console.log('set方法调用了', obj, prop, value);
return Reflect.set(obj, prop, value);
},
/*
* 获取目标对象的某个属性值
* 参数:
* 参数一:obj=>需要代理的目标对象
* 参数二:prop=>需要获取值的key
*/
get(obj, prop) {
console.log('get方法调用了', obj, prop);
return Reflect.get(obj, prop);
},
/**
* 删除目标对象上的某个属性
* 参数:
* 参数一:obj=>需要代理的目标对象
* 参数二:prop=>需要删除值的key
*/
deleteProperty(obj, prop) {
console.log('deleteProperty方法调用了', obj, prop);
return Reflect.deleteProperty(obj, prop);
}
});
proxyObj.name = '996';//改
console.log(proxyObj.name);//查
delete proxyObj.age;//删
console.log(obj);
proxyObj.wife.sex = '女';//增
console.log(obj);
2.VUE2.X实现响应式
- 对象: 通过defineProperty对对象的已有属性值的读取和修改进行劫持(监视/拦截)
- 数组: 通过重写数组更新数组一系列更新元素的方法来实现元素修改的劫持
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
</style>
</head>
<body>
<input type="text">
<span></span>
<script>
let obj = { name: 'zhangsan' };//初始数据
let newObj = JSON.parse(JSON.stringify(obj));//深拷贝数据
Object.defineProperty(obj, 'name', {
set(value) {
if (value !== obj.name) {
newObj.name = value;
observe();
}
},
get() {
return newObj.name
}
});
function observe() {
document.querySelector('span').innerText = obj.name;
document.querySelector('input').value = obj.name;
}
observe();
document.querySelector('input').addEventListener('input', function () {
obj.name = this.value
}, false)
</script>
</body>
沃梦达教程
本文标题为:VUE3.0-对比VUE2.X和VUE3.0的响应式
猜你喜欢
- vue keep-alive 2023-10-08
- 深入浅析AjaxFileUpload实现单个文件的 Ajax 文件上传库 2022-12-15
- ajax实现输入提示效果 2023-02-14
- 1 Vue - 简介 2023-10-08
- layui数据表格以及传数据方式 2022-12-13
- 关于 html:如何从 css 表中删除边距和填充 2022-09-21
- 基于CORS实现WebApi Ajax 跨域请求解决方法 2023-02-14
- JS实现左侧菜单工具栏 2022-08-31
- jsPlumb+vue创建字段映射关系 2023-10-08
- javascript 判断当前浏览器版本并判断ie版本 2023-08-08