vue2.0和vue3.0双向绑定的实现原理

news/2024/7/9 23:42:28 标签: vue, proxy, js, object

vue2.0的双向数据绑定其实就是用了es5新增加的Object.defineProperty来进行数据劫持的

<span id="spanName"></span>
<input type="text" id="inputName">
let obj = { name : '' };
let newObj = Object.parse(Object.stringify(obj)); // 深拷贝

Object.defineProperty(obj,'name',{ //数据拦截obj里面的name属性
    get(){
        return newObj.name; //这里不能return obj.name 因为这样算获取会重新执行get方法造成死循环,只能用新变量
    }
    set(val){
    	if(val === newObj.name) return;
    	newObj.name = val;
    	observer();
	}
})
// 监听方法
function observer() {
    spanName.innerHtml = obj.name;
    inputName.value = obj.name;
}
inputName.oninput = function(){
    obj.name = this.value;
}

存在的问题:

1.数据劫持时需要对原始数据进行克隆

2.需要分别给对象中的每一个属性设置监听(所以必须遍历对象的每个属性)

3.不能监听数组的变化

 

vue3.0运用的是es6的proxy来进行数据劫持的

let obj = {};
obj = new Proxy(obj,{ //拦截这个对象obj
    get(target,prop){ //target就是拦截的对象obj,prop是对象属性
        return target[prop];
    }
    set(target,prop,value){ // 设置的value值
    	target[prop] = value;
    	observer();
	}
})
// 监听方法
function observer() {
    spanName.innerHtml = obj.name;
    inputName.value = obj.name;
}
inputName.oninput = function(){
    obj.name = this.value; //赋值
}

proxy可以直接监听对象而非属性,可以直接监听数组的变化


http://www.niftyadmin.cn/n/1319171.html

相关文章

在Python中如何使用Linux的epoll

在Python中如何使用Linux的epoll目录序言阻塞socket编程示例异步socket的好处以及Linux epoll带epoll的异步socket编程示例性能注意事项源代码序言从2.6开始&#xff0c;Python包含了访问Linux epoll库的API。这篇文章用几个简单的python 3例子来展示下这个API。欢迎大家质疑和…

错误解决:ora-12638:身份证明检索失败

ora-12638:身份证明检索失败.with sql:select * from tzjdtdblink. 解决方法: 在dbastudio里看dtdblink的数据链路,未处于活动状态.再看域服务器不通.于是重启域服务器后解决问题. 在网上查一下,做更深一步解释:cause: 由于Oracle不能应用OS认证而导致凭证检索失败 中国网管联…

前端多页面的代码压缩和混淆

最近碰到一个老项目&#xff0c;用jq写的需要将代码进行压缩和混淆&#xff0c;后面选择了用 gulp 自动化构建工具&#xff0c;使用起来还是挺简单方便的&#xff01; 安装依赖 npm install gulp-cli -g npm install gulp -D 使用&#xff0c;新建文件gulpfile.js let gulp…

前端面试-http知识

http常见的状态码 1xx 服务器收到请求 2xx 请求成功 3xx 重定向 4xx 客户端错误 5xx 服务端错误 200 请求成功 301 永久重定向&#xff08;配合返回的location跳转&#xff09;例子&#xff1a;网页换了域名后&#xff0c;访问老域名后永久重定向到新域名 302 临时…

ibatis2.x调用oracle存储过程

一.JAVA对象public class User implements Serializable {private static final long serialVersionUID -6919964218508186044L; private int id; private String name; private Date birthday;public int getId() { return id; } public void setId(int id) { this.id…

JavaWeb过滤器Filter

Filter也称为过滤器&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截&#xff0c;从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息…

无奈bug太少,只能提出一点对原版软件的改进意见

1.添加任务窗口不会像添加约会窗口一样随主界面移动而移动 解决&#xff1a;这块将在新版中重新设计&#xff0c;已经考虑&#xff0c;没有问题。2.添加任务窗口与添加约会窗口总是重叠 解决&#xff1a;同1。3.点击ilifer主界面中左上角的标志&#xff0c;出现的介绍中即使最后…

前端面试-git使用

git是最常用的代码版本管理工具 git常用服务端代码托管&#xff1a;gitbub&#xff0c;coding.net 第一次使用前的指令&#xff1a; git config user.name [用户名] 第一次使用前&#xff0c;需要配置用户名 git config user.email [邮箱] 第一次使用前&#xff0c;需…